Golang编译应用时遇到"Undefined"错误如何解决

Golang编译应用时遇到"Undefined"错误如何解决 我遇到了这个错误,需要帮助。

tools/syz-env/env.go:52:36: target.CrossCFlags undefined (type *targets.Target has no field or method CrossCFlags)
Makefile:35: *** syz-env failed. Stop.
8 回复

你好,

错误信息显示:

target.CrossCFlags undefined (type *targets.Target has no field or method CrossCFlags)

targets.Target 是如何定义的?

更多关于Golang编译应用时遇到"Undefined"错误如何解决的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


该输出中的错误是:

cannot find package "github.com/google/syzkaller/pkg/glc" in any of:

你是否运行过 go get github.com/google/syzkaller/pkg/glc 来安装那个包?

感谢回复。我相信它定义在 pkg/compiler/compiler.go 文件中。

SyzVegas/env.go at 20200120 · SoveraNia/SyzVegas · GitHub :52

是的,它给了我一些关于不在同一目录下的错误。

go get …/google/syzkaller/pkg/glc
package …/google/syzkaller/pkg/glc: cannot find package “…/google/syzkaller/pkg/glc” in any of:
/home/jules/Desktop/year_report/go/…/google/syzkaller/pkg/glc (from $GOROOT)
/home/jules/Desktop/year_report/SyzVegas/src/…/google/syzkaller/pkg/glc (from $GOPATH)

感谢,这是一个很好的起点。该文件从 google/syzkaller 仓库导入了 Target 类型:

type Target struct {
	osCommon
	OS               string
	Arch             string
	VMArch           string // e.g. amd64 for 386, or arm64 for arm
	PtrSize          uint64
	PageSize         uint64
	NumPages         uint64
	DataOffset       uint64
	Int64Alignment   uint64
	LittleEndian     bool

确实没有定义 CrossCFlags 字段。

错误信息指向文件 tools/syz-env/env.go,该文件看起来属于 syzkaller,但仓库中似乎不包含该路径。

我推测这两个仓库中有一个存在问题,可能是检出的分支或提交不匹配。

感谢您的回复。 我匹配了检出并执行了:

jules@ubuntux:~/Desktop/year_report/SyzVegas$ make
GOOS=linux GOARCH=amd64 go install ./syz-manager
GOOS=linux GOARCH=amd64 go install ./syz-fuzzer
syz-fuzzer/fuzzer.go:25:2: cannot find package "github.com/google/syzkaller/pkg/glc" in any of:
	/home/jules/Desktop/year_report/go/src/github.com/google/syzkaller/pkg/glc (from $GOROOT)
	/home/jules/Desktop/year_report/SyzVegas/src/github.com/google/syzkaller/pkg/glc (from $GOPATH)
make: *** [Makefile:113: target] Error 1
make: *** Waiting for unfinished jobs....
syz-manager/rpc.go:16:2: cannot find package "github.com/google/syzkaller/pkg/glc" in any of:
	/home/jules/Desktop/year_report/go/src/github.com/google/syzkaller/pkg/glc (from $GOROOT)
	/home/jules/Desktop/year_report/SyzVegas/src/github.com/google/syzkaller/pkg/glc (from $GOPATH)
make: *** [Makefile:109: host] Error 1

并且安装 glc 失败了。

有任何帮助吗?

我尝试在我这边执行 go get,结果如下:

> go get github.com/google/syzkaller/pkg/glc
go: downloading github.com/google/syzkaller v0.0.0-20220201125236-4ebb27982f89
go: module github.com/google/syzkaller@upgrade found (v0.0.0-20220201125236-4ebb27982f89), but does not contain package github.com/google/syzkaller/pkg/glc

这看起来是一个正确的错误,因为 syzkaller 确实不包含 /pkg/glc 这个包。

我认为问题依然存在,是因为 SoveraNia/SyzVegas 是一个在 Go Module 时代之前创建的项目,并且没有更新以支持 Go Module 的使用。自那以后,外部依赖项肯定已经发生了变化,现在它们似乎包含了一些破坏性的更改,而这些更改本可以通过 Go Module 系统来避免。仓库所有者需要添加一个 go.mod 文件,并仔细地设置项目的外部依赖项,附带正确的版本信息。然而,这个仓库看起来已经很久没有维护了。并且仓库所有者自 2020 年 8 月以来在 GitHub 上就没有任何贡献。

在我看来,可能的选项是:fork 这个 SyzVegas 仓库并自己维护它,或者寻找替代方案。

这个错误是因为 targets.Target 结构体中没有 CrossCFlags 字段或方法。需要检查目标包的定义并调整代码。以下是解决方案:

1. 检查 targets.Target 的实际定义 首先确认 targets.Target 结构体中可用的字段名。通常可能是:

  • CrossCFlags 已重命名为其他名称(如 CFlags
  • 需要调用方法而非访问字段

示例:查看 targets 包定义

import "your-project/targets"

// 打印结构体信息
fmt.Printf("%+v\n", target)

2. 修改代码匹配实际字段名 根据实际定义调整代码。例如,如果字段名为 CFlags

// 原错误代码:
// flags := target.CrossCFlags

// 修改为:
flags := target.CFlags

3. 如果 targets 包来自第三方库 检查库版本是否更新导致 API 变更:

go list -m all | grep targets
go mod vendor

4. 完整修复示例 假设 targets.Target 的实际字段为 CFlags

// tools/syz-env/env.go 第52行附近
func buildEnv(target *targets.Target) []string {
    // 修改前:
    // cflags := target.CrossCFlags
    
    // 修改后:
    cflags := target.CFlags  // 使用正确的字段名
    
    env := []string{
        "CFLAGS=" + strings.Join(cflags, " "),
    }
    return env
}

5. 验证构建

make clean
make

如果问题仍存在,需要检查 targets 包的版本和文档,确保使用正确的 API。

回到顶部