go build 交叉编译的一些问题

问题

MacOS上默认编译类型为arm64-macos,能够成功编译,指定GOARCH=amd64 GOOS=linux时报错:

1
2
3
4
5
6
7
8
9
10
 ✘   GOARCH=amd64 GOOS=linux CGO_ENABLE=1 go build 

# runtime/cgo
linux_syscall.c:67:13: error: implicit declaration of function 'setresgid' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
linux_syscall.c:67:13: note: did you mean 'setregid'?
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/unistd.h:593:6: note: 'setregid' declared here
linux_syscall.c:73:13: error: implicit declaration of function 'setresuid' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
linux_syscall.c:73:13: note: did you mean 'setreuid'?
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/unistd.h:595:6: note: 'setreuid' declared here

解决

这是因为os本身系统库不兼容的问题,首先因为我是在macos上编译linux的版本,所以需要安装:

1
brew install FiloSottile/musl-cross/musl-cross

修改编译参数:

1
CGO_ENABLED=1 GOOS=linux GOARCH=amd64 CC=x86_64-linux-musl-gcc CXX=x86_64-linux-musl-g++ go build

通过两个步骤就能正常交叉编译出linux二进制文件了,但上传ubuntu机器上运行可能会报错:

这是因为linux机器也需要安装musl

1
2
3
4
5
6
apt-get update -y
apt-get install -y musl

# centos:
wget https://copr.fedorainfracloud.org/coprs/ngompa/musl-libc/repo/epel-7/ngompa-musl-libc-epel-7.repo -O /etc/yum.repos.d/ngompa-musl-libc-epel-7.repo
yum install -y musl-libc-static

go build 交叉编译的一些问题
http://example.com/2022/10/19/go-build-交叉编译的一些问题/
作者
Rae
发布于
2022年10月19日
许可协议