我们都知道在不涉及 CGO 的时候,Go 的交叉编译非常简单,只需要设置对应的 GOOS 和 GOARCH 即可,但当涉及到 CGO 时,问题就变得有点复杂了,因为你需要指定特定的 GCC。
例如,想在 Ubuntu 上交叉编译一个带有 CGO 的动态库,目标 CPU 架构为 arm,我们该如何操作呢?
示例代码
# shared.go
package main
import "C"
//export Sum
func Sum(a, b int) int {
return a + b
}
func main(){}
这个代码使用到了 CGO,然后暴露一个 Sum
方法,实现两个整数相加。
编译 32 位的 arm
因为通过设置 CGO_ENABLED=1
开启 CGO 编译,执行命令如下:
CGO_ENABLED=1 GOOS=linux GOARCH=arm go build -buildmode=c-shared -o share.so
但不幸,命令报错: gcc: error: unrecognized command line option '-marm'
。
正如一开始我提到,交叉编译 CGO 需要选择特定的 arm 交叉编译工具,而 Ubuntu 上编译 32 位的 arm 可以使用 gcc-arm-linux-gnueabihf
,安装命令如下: