Go build忽略文件而不说任何话

时间:2015-11-10 16:05:39

标签: windows 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不应该被忽略。请注意,当直接在foo_windows.go foo.go中包含方法时,Windows构建成功,因此它实际上是排除文件,并且该文件包含良好构建所需的所有内容。

在Mac上进行交叉编译并在Windows机器上正常编译会导致同样的文件排除问题,这让我相信文件本身会导致问题,但我不确定它是什么可能。

有谁知道为什么会这样?

1 个答案:

答案 0 :(得分:0)

我会回答我自己的问题并希望它可以帮助别人。

由于未出现的构建错误,

foo_windows.go未包含在构建中。具体来说,foo_windows.go包含C代码,并且因为CGO_ENABLED=0默认情况下,go没有尝试编译它,它只是看到文件中有C代码并排除了文件。设置CGO_ENABLED=1包含构建中的文件。