2013-06-05 198 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中使用相同的想法。

相关问题