摘要 :当我尝试交叉编译.go源文件(包括在文件链中某个位置的C文件),并从Mac主机定位Windows AMD64时,我得到:
/usr/local/go/src/runtime/cgo/gcc_windows_amd64.c:8:10: fatal error: 'windows.h' file not found
纯粹的Go代码似乎可以交叉编译而不会出错;当涉及C文件时,有没有办法获取正确的头文件进行交叉编译?
更多详细信息 :我在Mac上安装了LiteIDE,以用于某些.go项目,而LiteIDE使将其他平台作为构建目标变得相对容易。我纯粹在Go上的一个小型测试项目中对其进行了测试,它似乎没有错误地运行。
后来我在一个更大的当前项目中进行了尝试,并且不得不在IDE中调整一些环境设置才能使其正常工作(关于未启用CGO的C文件的投诉,即使GOPATH在.bash_profile中设置并在echo中进行了验证,GOPATH的设置也不正确$ VARIABLE很好。)结果是
尝试以Linux(os linux,arch amd64)为目标
# runtime/cgo ld: unknown option: --build-id=none clang: error: linker command failed with exit code 1 (use -v to see invocation)
我已仔细检查是否已安装XCode;gcc已安装:
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr with-gxx-include- dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/c++/4.2.1 Apple LLVM version 7.3.0 (clang-703.0.29) Target: x86_64-apple-darwin15.4.0 Thread model: posix InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
…而Go是最新版本:
go version go1.6.2 darwin/amd64
我还检查了这是否仅来自LiteIDE(因为LiteIDE似乎会覆盖环境设置并忽略终端中的内容?);在控制台上进行尝试的示例给出了:
MyUsername$ env GOOS=windows GOARCH=amd64 CGO_ENABLED=1 go build -v golang.org/x/net/html/atom runtime/cgo golang.org/x/crypto/ssh/terminal golang.org/x/net/html github.com/howeyc/gopass # runtime/cgo /usr/local/go/src/runtime/cgo/gcc_windows_amd64.c:8:10: fatal error: 'windows.h' file not found github.com/andybalholm/cascadia github.com/PuerkitoBio/goquery
我怀疑这是因为该应用程序在Go中使用了网络库,而且我认为本机库仍在调用一些C文件来填补空白。有没有一种方法可以获取在Linux / Windows上构建的正确库,或者是否需要在目标平台上完成才能工作?
在主机平台上构建本机应用程序似乎可以正常工作。
要为CGO启用交叉编译,您需要有一个本地工具链,可以为该目标编译C代码。
我对Mac OS X不太熟悉,但是在Arch Linux上,我要做的就是使用以下命令安装mingw-w64-toolchain并编译go代码:
mingw-w64-toolchain
env GOOS="windows" GOARCH="386" CGO_ENABLED="1" CC="i686-w64-mingw32-gcc" go build // or to target win 64 env GOOS="windows" GOARCH="amd64" CGO_ENABLED="1" CC="x86_64-w64-mingw32-gcc" go build
在OSX上,您可以使用homebrew安装mingw: brew install mingw-w64
brew install mingw-w64
但是,关于其他错误消息,ld: unknown option: --build-id=none似乎是一个错误,您可能需要在Go 问题跟踪器中报告该错误消息。
ld: unknown option: --build-id=none