在尝试构建我的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_windows.go
foo.go
中包含方法时,Windows构建成功,因此它实际上是排除文件,并且该文件包含良好构建所需的所有内容。
在Mac上进行交叉编译并在Windows机器上正常编译会导致同样的文件排除问题,这让我相信文件本身会导致问题,但我不确定它是什么可能。
有谁知道为什么会这样?
答案 0 :(得分:0)
我会回答我自己的问题并希望它可以帮助别人。
由于未出现的构建错误, foo_windows.go
未包含在构建中。具体来说,foo_windows.go
包含C代码,并且因为CGO_ENABLED=0
默认情况下,go没有尝试编译它,它只是看到文件中有C代码并排除了文件。设置CGO_ENABLED=1
包含构建中的文件。