2013-06-05 177 views
11

我正在嘗試爲Go語言編寫一些C語言綁定,並且在Windows中設置Cgo編譯時遇到了一些棘手的情況。我有一些代碼如下所示:是否可以在cgo CFLAGS註釋中使用環境變量?

// #cgo windows CFLAGS: -I C:/dev/extlibs/include/ 
// #cgo windows LDFLAGS: -lMyLib -L C:/dev/extlibs/lib/ 
// #include <mylib/mylib.h> 
import "C" 

這讓我避免安裝的DLL庫和頭文件直接到我的C:\ Windows目錄中,但不允許太多的靈活性,當其他開發商正在使用不同的文件系統設置(它們都需要將lib放在C:/ dev/extlibs /中)。

有沒有一種方法可以引用代碼中的環境變量?也許沿着這樣的路線:

// #cgo windows CFLAGS: -I $EXTLIBS$/include/ 

或者是有另一種方式,人們解決這個問題,我錯過了?我花了一些時間在這個主題上搜索,並沒有看到太多有用的東西,所以任何信息和/或資源都可能是真正的幫助!

回答

7

你可以使用環境變量嘗試,在Gentoo Linux Wiki page on Safe C Flags有以下形式的例

CXXFLAGS="${CFLAGS}" 

所以你可以做這樣的事情

// #cgo windows CFLAGS: -I "${EXTLIBS}"/include/ 

,但我的語法可能關閉,這可能是特定於Makefile的。

您也可以嘗試設置CPATH environment variable其中:

指定的目錄列表中搜索,就好像用-i指定的,但在命令行上-I選項給出的任何路徑之後。無論正在預處理哪種語言,都使用此環境變量。

等效爲-L是,我認爲,LIBRARY_PATH(在CPATH鏈接描述)。

根據http://golang.org/cmd/cgo/一個排序推薦的方式來解決這個問題的一個平臺獨立的方法是使用pkg-config

// #cgo pkg-config: mylib otherlib 

這是適用於Windows(http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/),並有對在this question (How to install pkg config in windows?)

除此之外安裝它一些更多的信息,把所有的依賴成細末代碼的一個子目錄,使用相對路徑在您的CFLAGSLDFLAGS中,並與其他開發人員共享整個包。

+0

這些是一些好主意。我會給他們一個嘗試。 FWIW,我在darwin/linux上使用了pk-config,但是它總是比Windows在過去值得的更麻煩。 –

+0

@ChrisCovert是的,我花了一段時間才弄清楚Win8上的依賴關係:-(儘管如此,鏈接的SO問題在評論中有一些好的鏈接 – Intermernet

+0

FWIW,我想我要去給pkg-config一個試試看,看看它是否比上次更好。謝謝你的資源! –

13

按照docs for CGO

建設時,將CGO_CFLAGS,CGO_CPPFLAGS,CGO_CXXFLAGS和 CGO_LDFLAGS環境變量加入到由 這些指令產生的標誌。應該使用 指令而不是環境變量來設置特定於包的標誌,以便在未修改的環境中可以在 中工作。

利用這些知識,只要將它作爲系統包提供,我就已經成功構建了third-party package that wraps a C library。這個例子我掛:

package sdl 

// #cgo LDFLAGS: -lSDL2 
// #include <SDL2/SDL.h> 
import "C" 

即使它指定一個系統包SDL2,我有安裝在一些非系統目錄SDL2,我能仍然建立使用一些環境變量,這個包我如下所示:

export SDL_PATH=/home/mark/where/I/installed/sdl 
CGO_CFLAGS="-I$SDL_PATH/include" CGO_LDFLAGS="-L$SDL_PATH/lib" go build hello.go 
LD_LIBRARY_PATH="$SDL_PATH/lib" ./hello 

當然,這是Linux,但您大概可以在Windows中使用相同的想法。

相關問題