GO交叉编译

直接编译

如果项目代码或者引用的包没有用到CGO代码,则可以直接指定系统GOOS和平台GOARCH,编译即可。

参数说明

  • CGO_ENABLED : CGO_ENABLED表示是否使用了CGO,交叉编译如果没有则关闭即可
  • GOOS: 目标系统平台
    • Mac对应darwin
    • Linux对应linux
    • Windows对应windows
  • GOARCH: 目标架构平台386amd64armarm64等,个人电脑一般都是amd64架构
    • 386也称x86对应32位操作系统
    • amd64也称x64对应64位操作系统
    • armarm64这种架构一般用于嵌入式开发
1
$ GOOS=linux GOARCH=amd64 go build -mod=vendor -ldflags "-s -w" -o name
CGO代码编译

CGO作为Go语言和C语言之间的桥梁,其使用场景可以分为两种:Go调用C程序和C调用Go程序。

参数说明

  • GOARM, 只有GOARCH是arm64才有效, 表示arm的版本, 只能是5,6,7其中之一, 默认6
  • CGO_ENABLED, 是否支持CGO交叉汇编, 值只能是0, 1, 默认情况下是0, 启用交叉汇编比较麻烦
  • CC, 当支持交叉汇编时(即 CGO_ENABLED=1), 编译目标文件使用的C编译器,例如: arm-linux-gnueabi-gcc
  • CXX, 当支持交叉汇编时(即 CGO_ENABLED=1), 编译目标文件使用的C++编译器,例如: arm-linux-gnueabi-g++
  • AR, 当支持交叉汇编时(即 CGO_ENABLED=1), 编译目标文件使用的创建库文件命令
ARM32
  • 交叉编译,目标为ARM32位Linux系统平台,C编译器指定为arm-linux-gnueabi-gcc
  • 当前项目使用了CGO,目标文件使用了C编译器,故需要指定C编译器arm-linux-gnueabi-gcc
  • ARM32位编译器下载地址,下载解压后,将对应bin目录添加到环境变量即可
1
$ GOOS=linux GOARCH=arm CGO_ENABLED=1  CC=arm-linux-gnueabi-gcc go build
ARM64
  • 交叉编译,目标为ARM64位Linux系统平台,C编译器指定为aarch64-linux-gnu-gcc
  • 当前项目使用了CGO,目标文件使用了C编译器,故需要指定C编译器arm-linux-gnueabi-gcc
  • ARM64位编译器下载地址,下载解压,将对应bin目录添加到环境变量即可
1
$ GOOS=linux GOARCH=arm64 CGO_ENABLED=1 CC=aarch64-linux-gnu-gcc go build
特定编译

如果项目用到了特定的C语言库库,可能是需要对该库单独编译处理的,比如libpcap这个C语言库。

参数说明

  • CGO_LDFLAGS 链接参数,主要包含要链接库的检索目录和要链接库的名字, 因为历史遗留问题,链接库不支持相对路径,我们必须为链接库指定绝对路径
  • CGO_CFLAGS 编译参数,主要是头文件的检索路径

1、先编译目标系统架构的libpcap版本,只编译不安装,以arm64为例

1
2
3
4
5
6
7
$ cd /tmp
$ wget http://www.tcpdump.org/release/libpcap-1.9.0.tar.gz
$ tar -zxvf libpcap-1.9.0.tar.gz
$ cd libpcap-1.9.0
$ export CC=aarch64-linux-gnu-gcc
$ ./configure --host=aarch64-linux --with-pcap=linux
$ make

2、然后再交叉编译中,指定编译好的链接库或头文件位置

1
$ CGO_ENABLED=1 GOOS=linux GOARCH=arm64 CC=aarch64-linux-gnu-gcc CGO_LDFLAGS="-L/tmp/libpcap-1.9.0" CGO_CFLAGS="-I/tmp/libpcap-1.9.0" go build
----------------本文结束 感谢阅读----------------