是否可以在cgo CFLAGS注释中使用环境变量?

时间:2013-06-05 04:41:53

标签: linker go cgo

我试图为Go语言编写一些C绑定,并且在Windows中设置Cgo编译时遇到了一种棘手的情况。我的代码如下所示:

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

这使我可以避免将Dll,libs和头文件直接安装到我的C:\ Windows目录中,但是当其他开发人员使用不同的文件系统设置时,它们不具备很大的灵活性(它们都是需要libs在C:/ dev / extlibs /...).

有没有办法可以在代码中引用环境变量?也许有些事情如下:

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

还是有另一种方式让人们解决这个我错过的问题吗?我花了一些时间在谷歌上搜索这个主题并且没有看到很多有用的东西,所以任何信息和/或资源都可以成为真正的帮助!

2 个答案:

答案 0 :(得分:17)

根据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中使用相同的想法。

答案 1 :(得分: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?)安装它的信息

除此之外,将所有依赖项放入go-code的子目录中,使用CFLAGSLDFLAGS中的相对路径,并与其他开发人员共享整个包。