在64位系统上编译32位二进制文件

34

我已经在64位系统上编写了一个Go程序,但我想编译出32位的二进制文件!

64位的二进制文件运行得非常好,但是我不知道如何创建32位的二进制文件。

我该怎么做?


你使用的是哪个集成开发环境(IDE)? - Esoteric Screen Name
2
我没有使用任何集成开发环境,只是一个文本编辑器和命令行。不管怎样,是否可能在VS中编译Go代码? - pluralism
1
尝试按照此处详细说明的方式使用GOARCH环境变量:http://stackoverflow.com/questions/7786492/how-do-you-build-the-8g-and-6g-go-compilers-for-go - Esoteric Screen Name
我设置了GOARCH和GOOS环境变量,但是我收到了这个错误信息:“go build runtime: exec: "C:\Go\pkg\tool\windows_amd64\8g.exe": GetFileAttributesEx C:\Go\pkg\tool\windows_amd64\8g.exe: winapi error #2” - pluralism
你需要先运行make.bat,并将GOARCH设置为386,以便重新编译x86的go。 - fuz
似乎有人遇到了同样的问题:https://github.com/DisposaBoy/GoSublime/issues/211 如果你们中有人知道如何删除Sublime Text数据,我会非常感激。 - pluralism
4个回答

28

如果您从源代码构建了Go,那么您可以为任何CPU和操作系统构建任何其他编译器和库。如果您使用的是windows/amd64并希望为windows/386构建,则会构建您需要编译windows/386的所有内容:

set GOARCH=386  
cd %GOROOT%\src  
make.bat --no-clean  

完成这个步骤后,您可以使用以下命令构建 windows/386 可执行文件:

set GOARCH=386  
cd %YOUR_PROG_DIR%  
go build  

由于您使用的是windows/amd64,您甚至应该能够运行/测试您的windows/386程序。只需确保在调用任何针对windows/386的命令之前设置GOARCH = 386

一个警告: 这不支持cgo,因此您不能使用任何使用cgo的包。


1
如果你执行 "go build -a" ,那么你是否仍需要在 GOROOT 目录内执行 "make.bat" 呢? - noj
@noj 我不清楚你的问题是什么?但是你只需要运行 make.bat 一次来构建所有编译器和标准包,之后就可以直接使用它们了。 - alex
2
make.bat是旧版本1.4...如何将其更新到新版本1.8.3并进行清理操作? - KingRider

9

在我的Windows 7 64位电脑上,我实现了这个目标(而不需要编译编译器),首先安装了Windows AMD64,然后下载32位压缩包并解压到第二个文件夹中:

\go\go32
\go\go64

通过调整命令提示窗口中的PATHGOROOT,可以按照以下方式轻松完成。
set PATH=\go\go32;%PATH%
set GOROOT=\go\go32\

然后我回去重新编译了之前使用64位编译的应用程序。如果您想经常切换,所有这些都可以在批处理中设置。


3
对我很有效,但我必须将路径设置为go32\BIN文件夹。 - user3523091

3

好的,我终于解决了这个问题!下面是我是如何做到的(实际上我一开始失败得很惨!)。

  • 首先,我从http://www.mingw.org/下载了GCC。

  • 接下来,我将C:\MinGW\bin添加到PATH环境变量中(我假设MinGW已安装在C:\MinGw中)。

  • 在运行go build/go install之前,需要设置环境变量。

  • 打开命令提示符并cd到C:\Go\src,然后从命令行运行all.bat。

  • GOOSGOARCHCGO_ENABLED分别设置为windows3860!(您还应该将GOPATH设置为当前Go项目的路径)。

  • 接下来运行make.bat和make.bat --no-clean。之后,您就可以为32位系统构建您的项目了!希望这有所帮助!


2

我的 Go 版本是 1.14 ,我将 make.bat 更改如下:

:: if "x%GOROOT_BOOTSTRAP%"=="x" set GOROOT_BOOTSTRAP=%HOMEDRIVE%%HOMEPATH%\Go1.4

将GOROOT_BOOTSTRAP更改为我的Go根目录:

if "x%GOROOT_BOOTSTRAP%"=="x" set  GOROOT_BOOTSTRAP=D:\Go

之后我遇到了这个错误

go tool dist: unknown $goarch 386

然后我设置了GOOS和GOARCH

setlocal
set GOROOT=%GOROOT_BOOTSTRAP%
set GOOS=
set GOARCH=
set GOBIN=
set GO111MODULE=off
"%GOROOT_BOOTSTRAP%\bin\go.exe" build -o cmd\dist\dist.exe .\cmd\dist
endlocal

请将GOOS和GOARCH设置如下:

setlocal
set GOROOT=%GOROOT_BOOTSTRAP%
set GOOS=windows
set GOARCH=386
set GOBIN=
set GO111MODULE=off
"%GOROOT_BOOTSTRAP%\bin\go.exe" build -o cmd\dist\dist.exe .\cmd\dist
endlocal

但是我遇到了错误,提示这不是一个32位程序。


嗨@Hui,我不知道你为什么修改了这个文件。我只是将GOROOT_BOOTSTRAP变量设置为c:\ go(如输出所示:“将GOROOT_BOOTSTRAP设置为工作的Go树”)。 - Jacek Szumigaj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接