使用C库进行包链接

时间:2014-11-29 05:40:11

标签: c go linkage cgo

我希望这是一个基本问题。我正在尝试构建一个Go包,其中包含用C编写的库中的函数。结构基本如下:

package too

/*
#cgo LDFLAGS: -L/usr/local/lib include -lbar
#include mybar.h
*/
import "C"

func MyGoWrapper () {
  C.orig_func()
}

运行go build foo.go失败并显示"未定义的引用"为orig_func请注意标题为mybar.h ;我为orig_func创建了原型库中未包含的原型。我是否需要首先重新编译库,包括此头文件,然后才能与Go构建链接?还是我完全误解了别的东西?

1 个答案:

答案 0 :(得分:2)

当链接到外部库时,您需要为目标体系结构单独编译它。 cgo无法替换configure / make(或其他)来编译库;它只知道如何在包目录中构建一些.c文件,并且库的构建过程可能更复杂。


我不太确定如何在交叉编译时完成更大的外部库链接任务(我不知道你已经完成了什么)。 The (closed) Go bug on cross-compilation with cgo looks useful here.您可能希望使用godoc cmd/cgo中描述的一些环境变量设置构建Go工具链

  

要在交叉编译构建期间启用cgo,请设置CGO_ENABLED       使用make.bash构建Go工具时,环境变量为1。       另外,将CC_FOR_TARGET设置为目标的C交叉编译器。 CC会       用于编译主机。

     

构建Go工具后,运行go命令时,CC_FOR_TARGET       被忽略了。运行make.bash时CC_FOR_TARGET的值是       默认编译器。但是,您可以设置环境变量CC,而不是       CC_FOR_TARGET,用于在运行go工具时控制编译器。

     

对于C ++代码,CXX_FOR_TARGET的工作方式类似。

该bug还提到了使用-ldflags="-extld=$(CC)"的人(其中$(CC)是他们想要使用的交叉编译器的名称)。

在你的示例代码中有一个明确的-L/usr/local/lib,我认为它不会起作用:我认为当你为目标构建库时,你会想要将它们放在一个不同的目录中主持人的lib。例如,this ARM cross-compilation HOWTO在某些地方使用/usr/local/arm-linux前缀或install_root。