Golang: 如何在Linux上交叉编译Windows程序

30

如何在Linux上交叉编译Go项目以生成可在Windows上运行的可执行文件?

2个回答

68

要在Linux上构建Windows程序,您需要将环境变量GOOS设置为Windows,将GOARCH设置为amd64

在Bash或ZSH上:

% GOOS=windows GOARCH=amd64 go build

如果您的程序包需要CGO,则需要使用mingw-w64编译器:

sudo apt-get install gcc-multilib
sudo apt-get install gcc-mingw-w64

GOOS=windows GOARCH=386 \
  CGO_ENABLED=1 CXX=i686-w64-mingw32-g++ CC=i686-w64-mingw32-gcc \
  go build

1
只是想澄清一下(至少现在),你只需要指定GOOS,GOARCH可以与你正在使用的相同。话虽如此,值得注意的是,GOOS区分大小写。我最初尝试设置GOOS=Windows,但没有任何影响,直到我注意到你将其设置为GOOS=windows - Dan
2
为什么使用 CGO 后,GOARCH 是 386?如果我想要构建 amd64 的话怎么办? - Elie G.
我得到了“i686-w64-mingw32-g++:在$ PATH中找不到可执行文件”的错误。 - Hasan A Yousef
2
我想你可以使用 x86_64-w64-mingw32-gccx86_64-w64-mingw32-g++ 来编译 amd64 - Frediano Ziglio

7

介绍

在生产过程中,您可能想要构建支持 Windows 架构的 go 程序,但这并不总是容易的,以下是一份指南,可以帮助您为 Windows 构建 go 程序。

CGO

Cgo 是 go 的一个元素,它允许 Go 包调用 C 代码。

但是,无论您是否使用 CGO,并不像“我是否调用了 C 代码”这么简单,因为虽然您可能没有在 Go 程序中调用 C 代码,但您正在使用的某个包可能会这样做。

为了找出这一点,最简单的方法是先尝试不使用 CGO,如果不起作用,则尝试第二个选项。(但如果您愿意,也可以尝试这个

如果您不需要 CGO

如果您不需要 CGO,则将 go 程序构建到另一个平台非常简单,因为 go 原生支持跨平台编译。 您只需要执行以下操作:

x64

#Compile your go program to the windows x64 platform 
env GOOS=windows GOARCH=amd64 go build package-import-path

x32

#Compile your go program to the windows x32 platform 
env GOOS=windows GOARCH=386 go build package-import-path

提示:由于Go原生支持交叉编译,因此您可以轻松地将程序构建到其他平台上,请进一步阅读这里

如果您需要使用CGO

如果您需要使用CGO,则构建您的程序会稍微复杂一些,因为C不支持本地跨平台编译。但是不用担心!使用MinGW64项目仍然非常容易。

要求

由于我们将使用mingw64来构建项目,因此我们需要确保已安装mingw。如果没有安装,可以按照以下方式安装:

Ubuntu

在Ubuntu上,只需运行以下命令:

sudo apt-get install gcc-mingw-w64

Fedora

在 Fedora 上只需运行:

sudo dnf install mingw64-gcc

构建

现在我们已经满足了要求,可以开始构建项目了。

针对 Windows x64 架构

在 Windows x64 架构上构建程序,请运行:

GOOS=windows GOARCH=amd64 CGO_ENABLED=1 CXX=x86_64-w64-mingw32-g++ CC=x86_64-w64-mingw32-gcc go build package-import-path

针对 Windows x32 架构

要在 Windows x32 架构上构建您的程序,请运行以下命令:

GOOS=windows GOARCH=386 CGO_ENABLED=1 CXX=i686-w64-mingw32-g++ CC=i686-w64-mingw32-gcc go build package-import-path

尝试了这种方法,但最终出现了这个错误:/usr/bin/x86_64-w64-mingw32-ld: cannot find -lstdc++。有任何想法是什么意思吗? - Carlos Bermudez
你好!看起来像是一个损坏的mingw安装或一些缺失的依赖关系。如果你有多个冲突的mingw安装,请卸载它们并只安装一个。如果重新安装仍然不行,你可以尝试运行 dnf provides lstdc++.so 并安装提供它的软件包。(我假设你正在使用Fedora) - Kalitsune
如果仍然无法正常工作,您可以尝试使用-lstdc++.so作为参数。 - Kalitsune

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