likes
comments
collection
share

Go 交叉编译真是方便

作者站长头像
站长
· 阅读数 31

GO 支持交叉编译,也就是说,可以用一个平台下的 Golang编译器,生成另外一个平台下的可执行程序

平时一般是在 Linux下编程,并且大部分的时间也是使用Docker镜像,所以一般不会在意这个交叉编译的功能

但是,这两天公司另外一个部门突然让生成一个exe文件,刚开始想的是找个安装go语言的windows平台,然后将git仓库上的代码拉取下来执行go build就好了;后来发现,使用交叉编译实在是太方便了,只需要执行一行编译的命令就搞定了

linux下生成MacWindow的可执行程序

CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build

window下生成MacLinux的可执行程序

SET CGO_ENABLED=0
SET GOOS=darwin
SET GOARCH=amd64
go build

SET CGO_ENABLED=0
SET GOOS=linux
SET GOARCH=amd64
go build

Mac下生成LinuxWindows下的可执行程序

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build

心想这样太简单了,这b不是分分中的事么,结果真是啪啪打脸啊

因为,在程序中用到了sqlite,而sqlite中又需要开启CGO,也就是说,需要在Go代码中用到c语言编程,或者是调用C代码的函数库

golang的交叉编译只能编译不同平台的go代码,但是编译不了不同平台的C代码,所以还需要安装一个指定平台的C代码的编译器

因为,打算是在Linux下编译生成windows64的可执行程序,所以,就在Linux下安装了一个windows下的C编译器,命令如下:

sudo apt install mingw-w64

这条命令安装了如下的两个编译器:

32位windows编译器i686-w64-mingw32-gcc和i686-w64-mingw32-g++
64位windows编译器x86_64-w64-mingw32-gcc和x86_64-w64-mingw32-g++

安装之后,就可以指定用这个编译器编译了,命令如下:

export GOOS=windows
export GOARCH=amd64
export CC=x86_64-w64-mingw32-gcc  //此处是指定 64 位的编译器,你可以指定 32 位的
export CXX=x86_64-w64-mingw32-g++
export CGO_ENABLED=1

配置env之后,再执行go buildok了;当然,你也可以那这写成一个脚本文件:

#!/bin/bash
export GOOS=windows
export GOARCH=amd64
export CC=x86_64-w64-mingw32-gcc
export CXX=x86_64-w64-mingw32-g++
export CGO_ENABLED=1
go build .

之后需要交叉编译时,直接执行这个脚本就好了

注:因为golang默认是开启cgo的,你可以用go env看到CGO_ENABLED="1",所以,如果你程序中没用到c编程或者调用C的函数库,那最好在编译的时候指定CGO_ENABLED=0,这样交叉编译就不需要这么复杂了

参考地址:blog.furry.top/archives/5/

转载自:https://juejin.cn/post/7097143703793303560
评论
请登录