[golang]如何在windows上使用cgo

一桶冷水發表於2017-12-20

golang的cgo是呼叫gcc編譯c程式碼的,gcc工具鏈在linux上很方便,但windows上是沒有的。而windows上一般用的vc,golang是不支援的。那麼如果確實有這樣的需求怎麼辦呢?用MinGW。

一般linux上的包是不能直接在windows上編譯的,除非藉助Cygwin或者MSYS。(然後還有一大堆依賴要解決)。專案上要cgo呼叫的是ImageMagick,直接能找到vc編譯好的庫,省去了一堆麻煩事。

這裡要注意MinGW有32位和64位之分(MinGW-w64),務必不要裝錯了。(32位gcc的預設編譯引數是相容幾十年前的386CPU,所以能放棄就放棄32位吧。。。好難得能甩掉那麼陳舊的歷史包袱)

下一個問題是vc庫的格式是.lib與gcc的.a是不同的,老版本的MinGW需要用reimp工具將lib轉成a,新版本直接相容lib格式,reimp也被移除了。考慮到後面連結引數比較難寫,直接簡單粗暴改名字了,CORE_RL_MagickCore_.lib -> libcore.a ,CORE_RL_MagickWand_.lib -> libwand.a。

剩下的事情就和linux上差不多了,set環境變數C_INCLUDE_PATH為include路徑,set環境變數CGO_LDFLAGS為-L "{lib路徑}" -lcore -lwand,最後記得加上ImageMagick sdk 中定義的編譯引數no_pkgconfig來遮蔽對pkgconfig的呼叫,go install -tags no_pkgconfig,完成。

因為go有編譯快取,也就是$GOPATH/pkg,只要cgo部分程式碼不變更,是不需要加這部分引數的。所以如果要使用cgo,像ImageMagick sdk一樣做一個薄封裝,將c函式轉成go函式是非常有必要的。

相關文章