直接编译
如果项目代码或者引用的包没有用到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其中之一, 默认6CGO_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 |