将Swift交叉编译为单个Linux二进制文件

21

是否可以从OS X电脑编译Swift二进制文件,使其作为单个二进制文件在运行Linux的服务器上,而无需额外的需要动态链接的库?

我考虑像传递-target到swift命令一样,并传递另一个参数来让它静态链接所有依赖项,但我不确定确切的命令是什么。

确切的-target值似乎相当难找到。

我需要知道确切的目标分发版本才能将正确的字符串传递给-target参数吗?


1
也许我误解了你的问题,但是Linux二进制文件(ELF)和Mac二进制文件(Mach-O)是不兼容的 - TheDarkKnight
我原本认为在OS X上使用本地的Apple编译器是不可能实现的,但我会关注这个问题的进展。 - TheDarkKnight
1
你需要在Linux系统上完成这个任务。Swift的Github仓库展示了如何构建适合特定环境的Swift版本。交叉编译更多用于处理器架构,例如x86 -> ARM,这是它的工作范围。从你的问题“编译一个Swift二进制文件”来看,这并没有意义,因为它已经是二进制形式,针对的是Mac OSX环境,无法在Linux上运行。也许你的意思是从源代码编译Swift。 - t0mm13b
我的意思是编译成单个二进制文件(无需动态链接库陪伴二进制文件)。 - hasen
@t0mm13b 我最终放弃了,创建了一个专门用于生成Linux构建的Linux虚拟机! - hasen
显示剩余5条评论
2个回答

14

阅读关于GitHub上的来源

  • 目标将是Linux
  • 机器将是x86_64

这将被主要的构建脚本调用

然而,这只回答了一部分问题

-target 的确切值似乎相当难以捉摸。

为Mac OSX安装一个可以重新定位到Linux的GCC工具链,例如OSXCross存储库。

在运行引用该工具链的脚本之前,提供环境变量的值给GCC。

不幸的是,这并不能保证它会起作用,但还是试一试看会发生什么。


1
“是否可能从运行OS X的计算机编译Swift二进制文件,以便在不需要动态链接任何额外库的情况下在运行Linux的服务器上作为单个二进制文件运行?” 简短的回答是什么?当然!只要你用心去做,一切皆有可能!“它是否高效?”本质上,不是。虽然我相信这里的每个人都熟悉编译器的工作原理,但为了回答这个问题和其最新用户,编译器是一种将人类可读代码转换为计算机可理解的二进制格式的应用程序。但值得一提的是,并非所有计算机都相同。每个计算机操作系统都有不同的二进制映射,因此像复制值这样的简单操作在一台机器上可以表示为1010,在另一台机器上可以表示为0101。正如之前在许多问题中所述,例如这一个, 许多编程语言可以在各种机器上构建,但很少有编程语言可以跨平台运行,因为每台计算机都有不同的二进制映射。

我该怎么解决这个问题呢?

  • 有多种解决方案可以解决这个问题。最明显的方法是将您的环境设置为目标环境,并构建您想要的程序。您已经通过虚拟机完成了这一过程,这通常是许多开发人员所做的。这是最简单的解决方案,但它违背了问题的本意,您希望只从OSX机器构建。

之前你说你听到人们在谈论如何在Linux机器上编译Windows程序。Cygwin是一个旨在获取在Linux机器上通常不存在的Windows框架的开发平台,允许许多程序以Windows框架为重点进行构建。然而,它所做的就是添加二进制文件,以便编译器在找到仅适用于Windows的命令时有一些正确的位置进行映射。它所做的就是引入必要的二进制配置,使程序能够成功移植。这与第二个选项有关。

  • 其次是支持跨平台编译的编译器。虽然我目前对这样的编译器并不了解或不熟悉,但从技术上讲,这是一个有效的解决方案,但我会称其为可靠吗?可能不会。如果说有什么用处,那只是让你的编译器多做了一些工作,因为它不仅必须正确地映射一个计算机程序的语法,而且还必须浪费时间将其链接到新的二进制文件中。此外,您还需要让编译器记住这些链接,这可能会导致更多浪费内存空间。

即便如此,像这样的系统也很少见,它是否能够保证正常工作取决于编译器维护者对自己的知识掌握程度、更新频率等等。而且,他们甚至能否在第一时间进行正确的二进制映射也不是我愿意拿我的生命来打赌的事情。

  • 第三种,也许是最理想的解决方案,是研究容器技术,例如docker。它们的容器本质上是一种方法,让您构建应用程序并将其移植到新机器上,而无需更改或修改有关如何构建和编译它的任何内容。只需构建一个,将其存储在容器中,将其移植到您选择的机器上,并将其集成到您当前的项目中。想想看,像docker这样的容器系统就是为了防止您当前正在经历的问题而建立的,即您在一台计算机上拥有源代码,但其他地方没有。像docker这样的东西将能够在任何计算机上运行您的代码,而无需为每个新计算机重新编译它。

Docker提供了一个有趣的容器到容器通信框架、应用程序示例以及相当简单的文档,值得一看,看看您的项目是否可以将其某些部分移植到docker中。

话虽如此,目前有多种方法可以解决您面临的问题,因此作为软件工程师,您可以自行决定如何处理您的项目。

//编辑//

等我不那么疲惫时,将编辑此内容以得到更好的回答。


1
Cygwin 不是为了在 Linux 上运行 Windows 应用程序,而是为了在 Windows 上运行 Linux 应用程序(顺便感谢提供链接,这样我就不必使用 Google ;) ) - Markaos
此外,服务器可能不使用在Linux上不可用的Swift部分(例如GUI库,我猜),因此它应该是高效的。 - Markaos
@Markaos,我知道这不是cygwin的本意。我指的是它添加了从编程角度需要但其他地方无法获得的二进制文件。如果您是一名在Linux上工作的C++开发人员,并且想让您的应用程序在Windows上运行,则需要一些Windows拥有而Linux没有的二进制软件包。我以为cygwin可以解决这个问题。我所提到的效率是指完成原始问题所需的内存、时间和复杂性方面的绕过方式。 - Jouster500

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