2016-04-28 67 views
0

摘要:當我嘗試交叉編譯包含文件鏈某處C文件的.go源文件,我從Windows主機的AMD64,我得到:Go/Golang交叉編譯從Mac到Windows:致命錯誤:找不到'windows.h'文件

/usr/local/go/src/runtime/cgo/gcc_windows_amd64.c:8:10: fatal error: 'windows.h' file not found 

Purely Go代碼似乎交叉編譯沒有錯誤;是否有一種方法可以在涉及C文件時獲取適當的頭文件進行交叉編譯?

更多詳細信息:我在我的Mac上安裝了LiteIDE,用於處理一些.go項目,LiteIDE使得將其他平臺作爲構建目標相對簡單。我在一個我有過的小測試項目上測試了它,純粹是Go,它似乎無誤地運行。

後來我在當前的大型項目上嘗試過它,並且必須在IDE中調整幾個env設置才能使其正常工作(在沒有啓用CGO的情況下對C文件提出投訴,即使設置爲.bash_profile,也沒有正確設置GOPATH並驗證回聲$變量就好了),結果是

/usr/local/go/src/runtime/cgo/gcc_windows_amd64.c:8:10: fatal error: 'windows.h' file not found 

試圖目標Linux操作系統(OS的Linux,拱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 version go1.6.2 darwin/amd64 

我也查了,這不只是從LiteIDE(因爲LiteIDE似乎忽略ENV設置和忽略什麼在終端?);在控制檯的例子試圖給出:

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 

我懷疑這是因爲應用程序使用的圍棋網絡庫,我覺得本機庫仍然調用一些C文件,填補了國內空白。有沒有一種方法可以在Linux/Windows上構建適當的庫,還是需要在目標平臺上完成才能工作?

在主機平臺上構建本地應用程序似乎沒有問題。

+0

你鐺似乎相當過時的(你不實際上有gcc順便說一句,它'鐺聲)。 – OneOfOne

+0

@OneOfOne檢查應用商店,它似乎是我可以使用的最新的Xcode? (不包括Xcode包括鏗鏘編譯器?) –

+0

我不是100%確定Xcode版本,但看看你的gcc版本它說4.2。1,這是非常過時的,但無論如何,你將不得不安裝一個工具鏈,可以編譯Windows和/或Linux的本地C代碼。 如果全部失敗,您可能需要考慮設置適用於Linux和Windows的VM。 – OneOfOne

回答

6

要啓用CGO的交叉編譯,您需要有一個本地工具鏈,可以爲該目標編譯C代碼。

我不是很熟悉的Mac OS X,但Arch Linux的所有我所要做的就是安裝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 

所以,你可能要考慮如何得到MinGW的(或在OS X

關於雖然其他錯誤消息類似的東西,ld: unknown option: --build-id=none似乎是一個錯誤,你可能想向大家報告,在圍棋issue跟蹤。