在尝试构建我的 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 不应被忽略。注意,直接在foo.go
中包含foo_windows.go
中的方法时,windows构建成功,所以确实是排除文件,文件包含了所有需要的东西一个好的构建。
在 mac 上交叉编译和在 windows 机器上正常编译都会导致相同的文件排除问题,这让我相信是文件本身导致了问题,但我不确定它是什么可能。
有人知道为什么会这样吗?
最佳答案
我会回答我自己的问题,希望它能帮助别人。
foo_windows.go
由于未表达的构建错误而未包含在构建中。具体来说,foo_windows.go
包含 C 代码,因为 CGO_ENABLED=0
默认情况下,go 没有尝试编译它,它只是看到文件中有 C 代码并且排除文件。设置 CGO_ENABLED=1
将文件包含在构建中。
关于windows - Go build 什么都不说就忽略文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33634358/