15

我正在尝试为 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、库和头文件直接安装到我的 C:\Windows 目录中,但是当其他开发人员使用不同的文件系统设置时(他们都需要库在 C:/dev/extlibs/...)。

有没有办法可以从代码中引用环境变量?也许是这样的:

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

或者人们是否有另一种方法可以解决我错过的这个问题?我花了一些时间在这个主题上搜索并没有看到太多有用的东西,所以任何信息和/或资源都可能是真正的帮助!

4

2 回答 2

17

根据CGO 的文档

构建时,将 CGO_CFLAGS、CGO_CPPFLAGS、CGO_CXXFLAGS 和 CGO_LDFLAGS 环境变量添加到从这些指令派生的标志中。应使用指令设置特定于包的标志,而不是环境变量,以便构建在未修改的环境中工作。

使用这些知识,我已经成功地构建了一个包装 C 库的第三方包,只要它将它作为系统包提供。我链接到的示例:

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

于 2014-02-16T08:30:52.693 回答
9

您可以尝试使用环境变量,Safe C Flags 上的 Gentoo Linux Wiki 页面有以下格式的示例

CXXFLAGS="${CFLAGS}"

所以你可以做类似的事情

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

但我的语法可能是关闭的,这可能是 Makefile 特定的。

您还可以尝试设置一个CPATH环境变量

指定要搜索的目录列表,就像使用 -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/),并且在这个问题上有一些关于安装它的更多信息(如何在 Windows 中安装 pkg 配置?)

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

于 2013-06-10T13:11:36.500 回答