• CentOS7中_带sqlite3_CGO的golang程序_交叉编译到arm中


    CentOS7中_带sqlite3_CGO的golang程序_交叉编译到arm中

    转载注明来源: 本文链接 来自osnosn的博客,写于 2019-10-28.

    编写了个golang程序,用到了这个CGO库github.com/mattn/go-sqlite3,用来支持sqlite3。
    在x86_64机器中编译运行都ok。另有一台arm机器,装了armbian。
    想在x86_64机器中交叉编译到arm64,碰到了一些问题。

    经过摸索,似乎解决了。写下笔记给后来人参考。


    环境:

    • x86_64机器,装的是centos7,64位的。
    • arm机器,aarch64-Linux-5.0.2-aml-s905, little_endian,装的armbian,64位的。

    尝试用go直接交叉编译

    • 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库没有加载。

    golang在没有CGO时,直接可以交叉编译。有CGO就不行了。

    尝试用arm的gcc

    • 在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文件和库文件。

    尝试交叉编译 arm 执行文件(32bit)

    • 之前已经安装 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

    build时,指定 sysroot 的位置。

    • 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后,无法执行(动态库ld-linux.so找不到)。似乎是32位的动态库没找到。

    尝试加上 -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 编译成功(有错误警告,说sqlite3使用了glibc动态库)。

    copy到armbian后,执行正常。执行文件是32位静态链接的。
    ---似乎成功了---

    armeb-linux-gnueabihf 中的 sysroot-glibc-linaro....-armlinux-gnueabihf.tar.xz文件 应该也可以。听说64位的arm,默认就是带hf的。
    我没有尝试。
    s905,好像是armv8的。估计用 armv8l-linux-gnueabihf 也行。我也没尝试。

    交叉编译 aarch64 执行文件(64bit)

    • 在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

    build时,指定 sysroot 的位置。

    • 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 编译成功。

    copy到armbian后,执行正常。执行文件是64位动态链接的。
    ---成功了---

    直接在armbian中用arm的golang build得到的执行文件,也是64位动态链接的。但体积要小些。比交叉编译的小几百KB。不知道为什么。


    转载注明来源: 本文链接 来自osnosn的博客.

  • 相关阅读:
    Animation(三)
    布局
    AutoCommpleteText
    PHP数组中常用函数
    Animation(四)
    转:JAVA内存映射文件
    Ubuntu安装jdk
    转:Java NIO 详解
    转:长连接与短连接
    Direct or Nondirect ByteBuffer
  • 原文地址:https://www.cnblogs.com/osnosn/p/11749922.html
Copyright © 2020-2023  润新知