我希望这是一个基本问题。我正在尝试构建一个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构建链接?还是我完全误解了别的东西?
答案 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。