直接编译
如果项目代码或者引用的包没有用到CGO代码,则可以直接指定系统GOOS和平台GOARCH,编译即可。
参数说明
- CGO_ENABLED: CGO_ENABLED表示是否使用了CGO,交叉编译如果没有则关闭即可
- GOOS: 目标系统平台- Mac对应darwin
- Linux对应linux
- Windows对应windows
 
- Mac对应
- GOARCH: 目标架构平台- 386、- amd64、- arm、- arm64等,个人电脑一般都是amd64架构- 386也称x86对应32位操作系统
- amd64也称x64对应64位操作系统
- arm与- arm64这种架构一般用于嵌入式开发
 
| 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 | $ cd /tmp | 
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 |