我正在尝试为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"
Run Code Online (Sandbox Code Playgroud)
这让我避免安装的DLL库和头文件直接到我的C:\ Windows目录,但是当其他开发人员使用不同的文件系统设置程序(它们都需要库是工作不允许太多的灵活性在C:/ dev/extlibs/...).
有没有办法可以从代码中引用环境变量?也许是这样的:
// #cgo windows CFLAGS: -I $EXTLIBS$/include/
Run Code Online (Sandbox Code Playgroud)
还是有另一种方式让人们解决我错过的这个问题?我花了一些时间在这个主题上搜索,并没有看到很多有用的东西,所以任何信息和/或资源都可以成为真正的帮助!
Mar*_*eth 17
构建时,CGO_CFLAGS,CGO_CPPFLAGS,CGO_CXXFLAGS和CGO_LDFLAGS环境变量将添加到从这些指令派生的标志中.应使用指令而不是环境变量来设置特定于程序包的标志,以便构建在未修改的环境中工作.
利用这些知识,我已经成功构建了一个包装C库的第三方软件包,只要它将其作为系统软件包提供.我链接到的示例:
package sdl
// #cgo LDFLAGS: -lSDL2
// #include <SDL2/SDL.h>
import "C"
Run Code Online (Sandbox Code Playgroud)
即使它为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
Run Code Online (Sandbox Code Playgroud)
当然,这是Linux,但你可以在Windows中使用相同的想法.
您可以尝试使用环境变量,Safe C Flags上的Gentoo Linux Wiki页面有以下格式的示例
CXXFLAGS="${CFLAGS}"
Run Code Online (Sandbox Code Playgroud)
所以你可能会做类似的事情
// #cgo windows CFLAGS: -I "${EXTLIBS}"/include/
Run Code Online (Sandbox Code Playgroud)
但我的语法可能已关闭,这可能是Makefile特定的.
您还可以尝试设置一个CPATH环境变量:
指定要搜索的目录列表,就像使用-I指定一样,但是在命令行上使用-I选项给出的任何路径之后.无论预处理哪种语言,都使用此环境变量.
-L我认为,相当于LIBRARY_PATH(在CPATH链接中描述).
据http://golang.org/cmd/cgo/一个排序推荐的方式来解决这个问题的一个平台独立的方法是使用pkg配置.
// #cgo pkg-config: mylib otherlib
Run Code Online (Sandbox Code Playgroud)
它可用于Windows(http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/),并且有关于在此问题上安装它的更多信息(如何在Windows中安装pkg配置?)
除此之外,把所有的依赖成细末代码的一个子目录,在您的使用相对路径CFLAGS和LDFLAGS,并与其他开发人员的整个包.
| 归档时间: |
|
| 查看次数: |
11120 次 |
| 最近记录: |