跨平台的Go二进制文件

3
我有一个.go文件,并使用Mac上的go build命令生成了二进制文件。是否有一种方法可以构建在Windows、Linux和IOS上运行的二进制文件?
我知道我们可以通过更改GOOS、GOARCH参数为每个平台构建二进制文件,但我希望有一个单独的go二进制文件,可以在所有平台上运行。请帮助我解决这个问题。
提前感谢您。

3
不同的操作系统在它们的应用程序二进制接口方面存在差异,这是不可避免的。 - undefined
我认为通常情况下不可能拥有多平台的二进制文件。无论是由Go编译器还是其他任何工具创建的,都无关紧要。 - undefined
1
首先,您必须修改所有操作系统以支持彼此的二进制文件,或者修改所有操作系统以支持一种通用的二进制格式,并修改Go工具以支持这种通用格式。换句话说,这是不可能的。 - undefined
你为什么要这样做呢?你有没有见过任何使用单一通用软件包的二进制分发的软件?我认为主要问题在于不同操作系统之间的入口点不同。 - undefined
我想将程序提供给软件的客户在他们的机器上运行。他们可能使用不同的平台。这就是为什么我在寻找一个通用文件的原因。我知道如何交叉编译它们并为每个系统创建一个源文件。 - undefined
这至少不能为Mac OS X和Linux做吗?我记得以前在某个地方见过通用二进制文件。 - undefined
2个回答

4
No,在Go或任何其他编程语言中都不可能(可执行文件必须适应个别平台和架构)。
然而,一些工具存在进行交叉编译。
这篇文章帮助解释如何使用Golang进行交叉编译(此时相当容易)。

还有一个Unix StackExchange的问题https://unix.stackexchange.com/a/298283/177527,解释了为什么不同的架构需要不同的二进制文件:

原因是代码被编译成特定架构的机器码,而不同处理器家族之间(例如ARM和x86)的机器码非常不同。

如此所述,二进制文件也取决于操作系统https://softwareengineering.stackexchange.com/a/251255:

二进制格式:可执行文件必须符合某种二进制格式,以使操作系统能够正确地加载、初始化和启动程序。Windows主要使用可移植可执行文件格式(Portable Executable format),而Linux使用ELF格式。

系统API:程序可能使用库,这些库必须存在于执行系统中。如果一个程序使用Windows API中的函数,则无法在Linux上运行。在Unix世界中,中央操作系统API已经标准化为POSIX:只使用POSIX函数的程序将能够在任何符合Unix系统上运行,例如Mac OS X和Solaris。


3
当然,使用多种编程语言是可以实现的:它们只需被解释(如Python、Perl等)或编译成某种中间格式(如Java、C#等)。当然,这意味着在每个目标平台上需要有一个解释器/运行时,并且所使用的库也必须是跨平台的,这本身就是一个问题。 - undefined
4
如果需要通过“特定于平台的二进制文件”来运行/解释,我并不认为它可以称为“跨平台二进制文件”。 - undefined
@JimB,嗯,我的思路是这样的:OP显然缺乏关于不同可执行文件格式/操作系统ABI的低级知识;我觉得答案在强调这一点上有点无聊,所以我想插一脚,为OP澄清一下。所以是的,你在技术上是正确的;也许我只是希望答案在细节上更加详细一些。;-) - undefined
我明白你的意思,但也许有一种方法可以为所有平台进行交叉编译,然后使用某种加载器来执行适合该平台的二进制文件。macOS 不是一段时间以前就做过类似的事情吗? - undefined

1
对于 Mac(而非 Windows),您可以将交叉编译与像 randall77/makefat 这样的工具相关联,生成“通用二进制文件”,该文件可在支持其中一个输入可执行文件的任何架构上运行。
目前 goreleaser/goreleaser PR 2572 已经实现了这一功能,这意味着整个过程将完全自动化。

https://user-images.githubusercontent.com/245435/136875000-a39aa3d1-b234-4585-89fb-934e80022367.png


小修正:目前只适用于 macOS 构建。 - undefined
1
@caarlos0 谢谢。我已经相应地编辑了答案。 - undefined

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