最近在工作中使用GO语言进行编码开发,因为项目中的环境时arm64,所以总是需要交叉建议,在arm下才能正确运行,GO语言还是非常强大的,在windows下就可以交叉编译各个环境的二进制文件,Gox是Go交叉编译的一种简单,简洁的工具,其行为类似go build。

一、安装

要安装Gox,请使用go get。我们标记版本,因此可以随时签出该标记并进行编译。安装成功后会生成gox命令行,使用gox --help

go get github.com/mitchellh/gox

二、使用

使用命令gox --osarch-list可以查看默认的编译环境,如下为显示的部分内容。

gox --osarch-list
Supported OS/Arch combinations for go1.17.4 are shown below. The "default"
boolean means that if you don't specify an OS/Arch, it will be
included by default. If it isn't a default OS/Arch, you must explicitly
specify that OS/Arch combo for Gox to use it.

darwin/386      (default: true)
darwin/amd64    (default: true)
linux/386       (default: true)
linux/amd64     (default: true)
linux/arm       (default: true)
freebsd/386     (default: true)
freebsd/amd64   (default: true)
openbsd/386     (default: true)
openbsd/amd64   (default: true)
windows/386     (default: true)
windows/amd64   (default: true)
freebsd/arm     (default: true)
netbsd/386      (default: true)
netbsd/amd64    (default: true)
netbsd/arm      (default: true)
plan9/386       (default: false)
dragonfly/386   (default: false)
dragonfly/amd64 (default: false)
nacl/amd64      (default: false)
nacl/amd64p32   (default: false)

如果想指定一个环境进行编译,则可以使用参数--osarch

gox --osarch="linux/arm64"

或者,只编译linux环境的二进制文件

gox -os="linux"

三、遇到的问题

1、开启CGO

在使用过程中,因为工程中包含C语言的库文件,因此在编译的时候需要开启CGO,CGO可以通过GO的环境变量设置。

go env -w CGO_ENABLED=1

 在设置完成后,执行gox报错了,但是具体看不出来是什么问题,于是我使用了go build查看,具体执行如下:

go build -tags=unix
# TrustZone/lib
cgo: C compiler "gcc" not found: exec: "gcc": executable file not found in %PATH%

可以看出,我的电脑上没有安装gcc的编译工具。安装过程,此处就不再赘述了。

2、修改环境变量

此处修改GO语言的环境变量,我是想不通过GOX命令工具实现交叉编译,于是我修改了环境变量:GOOS=linux、GOARCH=arm64。

还有上步设置的开启CGO,CGO_ENABLED,共三个环境变量。

于是问题出现了!!!

在其他go的工程中,三个环境变量也生效了,导致我点击调试按钮时,提示如下:

API server listening at: [::]:58306
could not launch process: not an executable file

调试器完成,并显示退出代码 1

刚开始并不知道是什么原因,没有生成可执行的文件。但是使用go build还是可以生成,仔细一想,原来在其它工程中设置的环境变量生效了,导致生成了linux环境下的可执行文件,所以这里才会提示没有可执行文件。将环境变量改回去即可正常开启调试!!!

在此记录下这两个问题