Golang交叉编译
Go里面交叉编译分两种:
- CGO编译:不支持交叉编译
- 原生GO编译:支持交叉编译
原生GO编译出来的,自带跨平台。而第三方使用了CGO进行编译的,需要辅助编译器来帮我们实现交叉编译。
原生GO编译
在没有CGO调用的情况下,交叉编译只需要带上三个参数便可以实现
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build
CGO_ENABLED: 1=开启CGO 0=关闭CGO。默认为1GOOS:平台系统GOARCH:平台架构(32位、64位)
可选参数-ldflags是编译选项:
-s -w:去除调试信息。可以减少构建后文件体积--extldflags "-static -fpic": 完成静态编译。编译生成的文件可以任意放在指定平台下运行,不需要运行环境配置
尽量选择静态编译。部分Linux上跑不起来,需要另外安装库
例如:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags '-s -w --extldflags "-static -fpic"' main.go
Windows平台下不含CGO编译:
执行命令行:
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -ldflags '-s -w --extldflags "-static -fpic"' main.go
执行GoLand命令行:
CGO_ENABLED=0;GOARCH=amd64;GOOS=windows;CGO_LDFLAGS="-static"
MacOS平台下不含CGO编译:
执行命令行:
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -ldflags '-s -w --extldflags "-static -fpic"' main.go
执行GoLand命令行:
GOARCH=amd64;GOOS=darwin
Linux平台下不含CGO编译:
执行命令行:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 CGO_LDFLAGS="-static" go build src/main.go
执行GoLand命令行:
CGO_ENABLED=0;GOARCH=amd64;GOOS=linux;CGO_LDFLAGS="-static"
CGO交叉编译
安装环境
在 MacOS 下编译 Linux 和 Windows 的可执行程序,需要使用 Homebrew 安装 C/C++ 交叉编译工具链:
brew install FiloSottile/musl-cross/musl-cross
brew install mingw-w64
Windows平台编译工具:mingw-w64
Linux平台编译工具:musl-cross
或者使用MacPorts安装 mingw-w64环境。时间很长
- 下载
MacPorts并安装
- 安装
mingw-w64
sudo port install mingw-w64
官网参考
https://ports.macports.org/port/mingw-w64
编译Windows平台
执行命令行:
CGO_ENABLED=1 CC="x86_64-w64-mingw32-gcc" GOOS=windows GOARCH=amd64 CGO_LDFLAGS="-static" go build src/main.go
执行GoLand命令:
CGO_ENABLED=1;CC=x86_64-w64-mingw32-gcc;GOARCH=amd64;GOOS=windows;CGO_LDFLAGS="-static"
编译Linux平台
执行命令行:
CGO_ENABLED=1 CC="x86_64-linux-musl-gcc" GOOS=linux GOARCH=amd64 CGO_LDFLAGS="-static" go build src/main.go
执行GoLand命令:
CGO_ENABLED=1;CC=x86_64-linux-musl-gcc;GOARCH=amd64;GOOS=linux;CGO_LDFLAGS="-static"
编译MacOS平台
目前编译到MacOS平台下的,交叉编译工具没有。
项目需要使用Sqlite3数据库。驱动go-sqlite3使用CGO编译。
在Mac系统下,编译对应的两个平台。目前是可以打包对应平台下的包,记录一下
sqlite3交叉编译