golang跨平台编译的问题
golang跨平台编译问题
这好像是第好几次出现了。没法,还是得写一下记录一下。
在macOS上编译linux的时候,以前都是正常的,但是可能升级到了新的macOS版本导致的问题,其中的CommandLineTools也已经更新到了新的版本,但是没用。
情况就是当在macOS上编译linux可执行文件的时候:
CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build -o example example.go
会出现下面的错误:
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'?
解决办法
这个问题的解决办法是:
- 安装musl-cross
brew install FiloSottile/musl-cross/musl-cross
brew info musl-cross
- 重新编译
GOOS=linux CC="x86_64-linux-musl-gcc" GOARCH=amd64 CGO_ENABLED=1 go build -o example example.go
- 上传到linux服务器后,给对应的linux服务器安装musl-tools
- Ubuntu
sudo apt-get update sudo apt-get install 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
- Ubuntu
- 运行
这时候,就可以在linux服务器上运行了。