golang传的很牛X,但不能交叉编译,对我来说一点用都没有,有个开源项目是用golang写的,如果不能在arm上用,那么我只能将它“翻译”成C,再集成到我的产品中,但我没有这个时间。
好在交叉编译最后还是成功了。
1. 准备工作
1.1 golang环境及arm交叉编译工具
可以参考《golang安装手札》这篇文章。
1.2 GCC交叉编译器
在1.1基础上,已经可以编译能在Arm上运行的纯golang写的二进制了,但有一个尚未解决的问题是:golang与C联合开发的模块,编译时报错:
can't load package: no buildable Go source files in /...
问题原因在于,关闭cgo的情况下,golang的编译器会自动“忽略”掉带有"import "C""字样的源文件。解决这个问题需要打开cgo的支持,如编译时的命令改为:
GOARCH=arm CGO_ENABLED=1 go build hello.go
但这还不够,还需要安装arm平台的编译器,如gcc-4.7-arm-linux-gnueabi(版本号要与目标平台的版本号一致),以及gcc-4.7-multilib-arm-linux-gnueabi的支持。还需要将/usr/bin/gcc重新ln到arm的交叉编译器上。
完成以上工作后,import "C"就没问题了。
1.3 第三方库
使用import "C"的主要目的就是使用第三方开源库,golang查找第三方库使用的是pkg-config,首先要保证pkg-config正常工作;另外,要保证第三方库,及第三方库的依赖库,都是arm版本的,才能正常link成功。链接成功的golang的程序,就可以愉快的在arm板上运行了。
golang的初步冒险就到些结束了,从下代码到完成这篇blog,用时一天多的时间,我的程序也快乐的在板子上运行中。
有疑问加站长微信联系(非本文作者)