Golang交叉编译
Golang交叉编译遇到的问题
- 交叉编译
- go支持的平台和版本
交叉编译
go支持的平台和版本
查询命令:
go tool dist list
显示结果:
aix/ppc64android/386android/amd64android/armandroid/arm64darwin/amd64darwin/arm64dragonfly/amd64freebsd/386freebsd/amd64freebsd/armfreebsd/arm64illumos/amd64ios/amd64ios/arm64js/wasmlinux/386linux/amd64linux/armlinux/arm64linux/loong64linux/mipslinux/mips64linux/mips64lelinux/mipslelinux/ppc64linux/ppc64lelinux/riscv64linux/s390xnetbsd/386netbsd/amd64netbsd/armnetbsd/arm64openbsd/386openbsd/amd64openbsd/armopenbsd/arm64openbsd/mips64plan9/386plan9/amd64plan9/armsolaris/amd64windows/386windows/amd64windows/armwindows/arm64
-
golang 在跨平台编译时,只需要指定目标操作系统的 OS(GOOS="darwin")和 CPU 架构(GOARCH="amd64")
-
通过 go env -w GOARCH=xxx 来进行指定
-
在不需要引入 CGO 代码进行交叉编译时,需要指定 CGO_ENABLE=0
-
使用 CGO 代码时,必须指定 CGO_ENABLE=1
-
当 CGO_ENABLE=1 时,必须制定了交叉编译链,CC=gcc 和 CXX=g++
-
假设我们编译32位 mipsle 平台的程序,就要提前下载 mipsle 版本的c++交叉编译工具CGO_ENABLED=1 GOOS=linux GOARCH=mipsle CC="mipsel-linux-uclibc-gcc" CXX="mipsel-linux-uclibc-g++" go build xxx.go
-
mips是big-endian的mips架构,mipsel是little-endian的mips架构
-
如果调用的 CGO 调用了 C 代码中的各种依赖库,那么在编译的时候回报依赖库 not found
-
解决方案是必须在编译时,加上指定的参数,链接的库必须交叉编译到目标平台的系统库而不是当前系统
-
主要是三个参数:-I , -isystem , -L
-
例如:CGO_ENABLED=1 GOOS=linux GOARCH=mipsle CC=mipsel-linux-uclibc-gcc -Wall -std=c++11 -Llib -isystem/aarch64/usr/include -L/aarch64/lib -ldl -lpthread -Wl,-rpath-link,/aarch64/lib -L/aarch64/lib/aarch64-linux-gnu -L/aarch64/usr/lib -I/aarch64/usr/include -L/aarch64/usr/lib/aarch64-linux-gnu -ldl -lpthread -Wl,-rpath-link,/aarch64/usr/lib/aarch64-linux-gnu -lphonon -lcurl -lprotobuf go build xxx.go
-
尽量不要用 CGO ,会降低代码的可读性和交叉编译的复杂度,以及后期维护