猿问

Go build 忽略文件而不说什么

在尝试构建我的 go 程序的 Windows 版本时,我遇到了一些非常奇怪的行为。


我的目录包含:


foo.go  

foo_windows.go  

foo_windows_test.go  

foo_unix.go  

foo_linux.go  

foo_linux_test.go  

foo_darwin.go  

Windows 构建失败,因为构建忽略了 foo_windows.go,出于某种原因。请注意,// +build任何文件中都没有注释。这是构建文件列表的输出:


$ GOOS=linux GOARCH=amd64 go list -f '{{.IgnoredGoFiles}}' github.com/foo/

[foo_darwin.go foo_windows.go foo_windows_test.go]


$ GOOS=darwin GOARCH=amd64 go list -f '{{.IgnoredGoFiles}}' github.com/foo/

[foo_linux.go foo_linux_test.go foo_windows.go foo_windows_test.go]


$ GOOS=windows GOARCH=amd64 go list -f '{{.IgnoredGoFiles}}' github.com/foo/

[foo_darwin.go foo_linux.go foo_linux_test.go foo_unix.go foo_windows.go]

显然最后一项是非常错误的。foo_windows.go 不应被忽略。请注意,当直接包含 infoo_windows.go中的方法时foo.go,windows 构建成功,因此它确实排除了该文件,并且该文件包含了良好构建所需的一切。


在 mac 上交叉编译和在 windows 机器上正常编译都会导致相同的文件排除问题,这让我相信是文件本身导致了问题,但我不确定它可能是什么。


有谁知道为什么会这样?


慕雪6442864
浏览 222回答 1
1回答

一只甜甜圈

我会回答我自己的问题,希望它可以帮助别人。foo_windows.go由于未表达的构建错误,未包含在构建中。具体来说,foo_windows.go包含C代码,因为CGO_ENABLED=0默认情况下,go并没有尝试编译它,它只是看到文件中有C代码并排除了该文件。设置CGO_ENABLED=1包含在构建中的文件。
随时随地看视频慕课网APP

相关分类

Go
我要回答