【问题标题】:Compile 32 bit binary on 64 bit system在 64 位系统上编译 32 位二进制文​​件
【发布时间】:2020-09-05 20:29:01
【问题描述】:

我在 64 位系统中编写了一个 Go 程序,但我想编译一个 32 位二进制文​​件!

64 位二进制文​​件很好用,但我不知道如何创建 32 位二进制文​​件。

我该怎么做?

【问题讨论】:

  • 你用的是什么IDE?
  • 我没有使用任何 IDE。只是一个文本编辑器和命令行。无论如何,是否可以在VS中编译go代码?
  • 尝试使用 GOARCH 环境变量,详见此处:stackoverflow.com/questions/7786492/…
  • 我设置了 GOARCH 和 GOOS 环境变量,但出现此错误:“go build runtime: exec:”C:\\Go\\pkg\\tool\\windows_amd64\\8g.exe ": GetFileAttri butesEx C:\Go\pkg\tool\windows_amd64\8g.exe: winapi 错误 #2"
  • 您首先必须运行 make.bat 并将 GOARCH 设置为 386 才能重新编译 go for x86。

标签: windows go


【解决方案1】:

如果您从源代码构建您的 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 的任何命令之前,请确保 set GOARCH=386

一个警告:这不支持cgo,所以你不能使用任何使用cgo的包。

【讨论】:

  • 如果你改为运行“go build -a”,还需要在GOROOT目录下运行“make.bat”吗?
  • @noj 我不清楚你的问题?但是您运行一次 make.bat 来构建所有编译器和标准包。之后你就可以使用它们了。
  • make.bat 是旧版本 1.4 ...如何清理到新版本 1.8.3?
【解决方案2】:

我在 Windows 7 64 位 PC 上实现此目的(无需编译任何编译器)的方法是首先安装 windows amd64,然后将download 32bit zip 并解压缩到第二个文件夹:

\go\go32
\go\go64

然后在我的命令提示符窗口中调整PATHGOROOT,如下所示:

set PATH=\go\go32;%PATH%
set GOROOT=\go\go32\

然后我返回并重新编译了我之前使用 64 位编译的应用程序。如果您想定期切换,所有这些都可以批量设置。

【讨论】:

  • 为我工作,但我必须将 PATH 设置为 go32\BIN 文件夹。
【解决方案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 设置为 windows386 和 0! (您还应该将 GOPATH 设置为当前 Go 项目所在的路径)。

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

【讨论】:

    【解决方案4】:

    我的 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 AND 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 树”
    猜你喜欢
    • 2011-09-08
    • 2011-11-26
    • 2021-11-18
    • 2011-11-11
    • 2011-06-30
    • 2020-07-06
    相关资源
    最近更新 更多