刘志礼 發表於 2025-11-14 11:28:51

GO语言中gox交叉编译的实现

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">一、安装</a></li><li><a href="#_label1">二、使用</a></li><li><a href="#_label2">三、遇到的问题</a></li><ul class="second_class_ul"><li><a href="#_lab2_2_0">1、开启CGO</a></li><li><a href="#_lab2_2_1">2、修改环境变量</a></li></ul></ul></div><p>最近在工作中使用GO语言进行编码开发,因为项目中的环境时arm64,所以总是需要交叉建议,在arm下才能正确运行,GO语言还是非常强大的,在windows下就可以交叉编译各个环境的二进制文件,Gox是Go交叉编译的一种简单,简洁的工具,其行为类似<code>go build。</code></p>
<p class="maodian"><a name="_label0"></a></p><h2>一、安装</h2>
<p>要安装Gox,请使用<code>go get</code>。我们标记版本,因此可以随时签出该标记并进行编译。安装成功后会生成gox命令行,使用gox --help</p>
<div class="jb51code"><pre class="brush:go;">go get github.com/mitchellh/gox</pre></div>
<p class="maodian"><a name="_label1"></a></p><h2>二、使用</h2>
<p>使用命令gox --osarch-list可以查看默认的编译环境,如下为显示的部分内容。</p>
<div class="jb51code"><pre class="brush:go;">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)
</pre></div>
<p>如果想指定一个环境进行编译,则可以使用参数--osarch</p>
<div class="jb51code"><pre class="brush:go;">gox --osarch="linux/arm64"</pre></div>
<p>或者,只编译linux环境的二进制文件</p>
<div class="jb51code"><pre class="brush:go;">gox -os="linux" </pre></div>
<p class="maodian"><a name="_label2"></a></p><h2>三、遇到的问题</h2>
<p class="maodian"><a name="_lab2_2_0"></a></p><h3>1、开启CGO</h3>
<p>在使用过程中,因为工程中包含<span><strong>C语言</strong></span>的库文件,因此在编译的时候需要开启CGO,CGO可以通过GO的环境变量设置。</p>
<div class="jb51code"><pre class="brush:go;">go env -w CGO_ENABLED=1</pre></div>
<p>&nbsp;在设置完成后,执行gox报错了,但是具体看不出来是什么问题,于是我使用了go build查看,具体执行如下:</p>
<div class="jb51code"><pre class="brush:go;">go build -tags=unix
# TrustZone/lib
cgo: C compiler "gcc" not found: exec: "gcc": executable file not found in %PATH%
</pre></div>
<p>可以看出,我的电脑上没有安装gcc的编译工具。安装过程,此处就不再赘述了。</p>
<p class="maodian"><a name="_lab2_2_1"></a></p><h3>2、修改环境变量</h3>
<p>此处修改GO语言的环境变量,我是想不通过GOX命令工具实现交叉编译,于是我修改了环境变量:GOOS=linux、GOARCH=arm64。</p>
<p>还有上步设置的开启CGO,CGO_ENABLED,共三个环境变量。</p>
<p><span><strong>于是问题出现了!!!</strong></span></p>
<p>在其他go的工程中,三个环境变量也生效了,导致我点击调试按钮时,提示如下:</p>
<div class="jb51code"><pre class="brush:plain;">API server listening at: [::]:58306
could not launch process: not an executable file

调试器完成,并显示退出代码 1</pre></div>
<p>刚开始并不知道是什么原因,没有生成可执行的文件。但是使用go build还是可以生成,仔细一想,原来在其它工程中设置的环境变量生效了,导致生成了linux环境下的可执行文件,所以这里才会提示没有可执行文件。将环境变量改回去即可正常开启调试!!!</p>
頁: [1]
查看完整版本: GO语言中gox交叉编译的实现