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.
你好,
错误信息显示:
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。

