3

我希望这是一个基本问题。我正在尝试构建一个 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 构建链接之前,我是否需要先重新编译库,包括这个头文件?还是我完全误解了其他东西?

4

1 回答 1

2

链接到外部库时,您确实需要为您的目标架构单独编译它。cgo无法替换configure/ make(或其他)来编译库;它只知道如何.c在你的包目录中构建几个文件,而一个库的构建过程可能会更复杂。


我不太确定在交叉编译时如何完成在外部库中链接的更大任务(而且我不确定你已经完成了什么)。交叉编译的(已关闭)Go 错误在cgo这里看起来很有用。您可能希望使用以下描述的一些环境变量集构建 Go 工具链godoc cmd/cgo

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

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

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

该错误还提到了使用的人-ldflags="-extld=$(CC)"$(CC)他们想要使用的交叉编译器的名称在哪里)。

在您的示例代码中有一个明确的-L/usr/local/lib,我认为这不会起作用:我认为当您为目标构建库时,您将希望将它们放在与lib您的主机架构不同的目录中。例如,这个 ARM 交叉编译 HOWTO在某些地方 使用了/usr/local/arm-linux前缀或 install_root。

于 2014-11-29T07:20:09.763 回答