主页

索引

模块索引

搜索页面

3.8.2. 跨os相关问题

交叉编译问题

一般情况

# mac上编译linux和windows二进制
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build

# linux上编译mac和windows二进制
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build

# windows上编译mac和linux二进制
SET CGO_ENABLED=0 SET GOOS=darwin SET GOARCH=amd64 go build main.go
SET CGO_ENABLED=0 SET GOOS=linux SET GOARCH=amd64 go build main.go

交叉编译是下支持CGO

交叉编译是不支持CGO的,也就是说如果你的代码中存在C代码,是编译不了的:

// 注意: 比如说你的程序中使用了sqlite数据库,在编译go-sqlite驱动时按照上面的做法是编译不通过的
// 需要CGO支持的,要将CGO_ENABLED的0改为1,也就是CGO_ENABLED=1

x86 linux上编译arm版的二进制:

$ CGO_ENABLED=1 GOOS=linux GOARCH=arm CC=arm-linux-gnueabi-gcc go build

Mac 下交叉编译 x86:

安装依赖:
$ brew install FiloSottile/musl-cross/musl-cross
编译:
$ CGO_ENABLED=1 GOOS=linux  GOARCH=amd64  CC=x86_64-linux-musl-gcc  CXX=x86_64-linux-musl-g++ go build -o BIN_NAME

运行时可能报:
/lib/ld-musl-x86_64.so.1: bad ELF interpreter: No such file or directory
这是因为 linux 没有安装 musl 的支持

相关错误:

1. implicit declaration of function 'setresgid' is invalid in C99

其他

cannot execute binary file

原因:

编译生成的是32位的二进制
却运行在64位系统中

解决方法:

env GOOS=linux GOARCH=amd64 go build alilog.go

Golang编译的二进制文件在alpine中无法运行

使用golang编译了一个二进制程序,在CentOS和Ubuntu的镜像上运行是可以的,但是在Alpine运行就不行,使用./运行报错:

/bin/sh: ./saas_server: not found
1
/bin/sh: ./saas_server: not found

解决方案 [2]

// 编译时添加参数CGO_ENABLED=0,关闭CGO就可以了
// 注意: Neither GOOS=linux nor GOARCH=amd6 was necessary.
$> CGO_ENABLED=0 go build

go tool cgo: exit status 2

原因:

有两个go版本:
执行命令的是A
GOPATH用的是B

解决方法:

使用相同的版本

主页

索引

模块索引

搜索页面