CentOS7中_带sqlite3_CGO的golang程序_交叉编译到arm中
转载注明来源: 本文链接 来自osnosn的博客,写于 2019-10-28.
编写了个golang程序,用到了这个CGO库github.com/mattn/go-sqlite3
,用来支持sqlite3。
在x86机器中编译运行都ok。另有一台arm机器,装了armbian。
想在x86机器中交叉编译到arm64,碰到了一些问题。
经过摸索,似乎解决了。写下笔记给后来人参考。
环境:
- x86机器,装的是centos7,64位的。
- arm机器,aarch64 -Linux-5.0.2-aml-s905,装的armbian,64位的。
第一次尝试交叉编译
用CGO_ENABLED=1 GOOS=linux GOARCH=arm GOARM=7 go build -ldflags "-w -s" -o arm-mygofile mygofile.go
交叉编译失败。
用CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=7 go build -ldflags "-w -s" -o arm-mygofile mygofile.go
交叉编译成功,但执行时发现sqlite3库没有加载。
在centos7中安装,yum install gcc-arm-linux-gnu
用CGO_ENABLED=1 GOOS=linux GOARCH=arm GOARM=7 CC=arm-linux-gnu-gcc go build -ldflags "-w -s" -o arm-mygofile mygofile.go
交叉编译失败。说stdlib.h找不到。
从 arm-linux-gnu-gcc -v
中看到 sysroot目录 /usr/arm-linux-gnu/sys-root/
为空。
从 yum search 中,也没找到对应的包。看来只能手工去下载编译用的head文件和库文件。
交叉编译 aarch64 执行文件
在centos7中安装,yum install gcc-aarch64-linux-gnu
去https://releases.linaro.org/components/toolchain/binaries/
找 latest-7
下载 aarch64-linux-gnu/sysroot-glibc-linaro-2.25-2019.02-aarch64-linux-gnu.tar.xz
解压 tar Jxvf sysroot-glibc-linaro-2.25-2019.02-aarch64-linux-gnu.tar.xz
用 CGO_ENABLED=1 GOOS=linux GOARCH=arm64 CC="aarch64-linux-gnu-gcc" CGO_CFLAGS="-g -O2 --sysroot=/..../sysroot-glibc-linaro-2.25-2019.02-aarch64-linux-gnu/" CGO_LDFLAGS="-g -O2 --sysroot=/..../sysroot-glibc-linaro-2.25-2019.02-aarch64-linux-gnu/" go build -ldflags "-w -s" -o arm-mygofile mygofile.go
编译成功。执行文件是动态连接的。
这个交叉编译得到的文件,对比直接在armbian中编译得到的文件,armbian编译的要小一些。不知道为什么。两个执行文件执行都没有问题。
---成功了---
尝试交叉编译 arm 执行文件
之前已经安装 yum install gcc-arm-linux-gnu
去https://releases.linaro.org/components/toolchain/binaries/
找 latest-7
下载 arm-linux-gnueabi/sysroot-glibc-linaro-2.25-2019.02-arm-linux-gnueabi.tar.xz
解压 tar Jxvf sysroot-glibc-linaro-2.25-2019.02-arm-linux-gnueabi.tar.xz
用 CGO_ENABLED=1 GOOS=linux GOARCH=arm GOARM=7 CC=arm-linux-gnu-gcc CGO_CFLAGS="-g -O2 --sysroot=/..../sysroot-glibc-linaro-2.25-2019.02-arm-linux-gnueabi/" CGO_LDFLAGS="-g -O2 --sysroot=/..../sysroot-glibc-linaro-2.25-2019.02-arm-linux-gnueabi/" go build -ldflags "-w -s" -o arm-mygofile mygofile.go
编译成功。但copy到armbian后,无法执行(动态库找不到)。
尝试加上 -static 参数。使用静态链接。
用 CGO_ENABLED=1 GOOS=linux GOARCH=arm GOARM=7 CC=arm-linux-gnu-gcc CGO_CFLAGS="-g -O2 --sysroot=/..../sysroot-glibc-linaro-2.25-2019.02-arm-linux-gnueabi/" CGO_LDFLAGS="-g -O2 --sysroot=/..../sysroot-glibc-linaro-2.25-2019.02-arm-linux-gnueabi/ -static" go build -ldflags "-w -s" -o arm-mygofile mygofile.go
编译成功(有错误警告)。copy到armbian后,执行正常。
---似乎成功了---