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

时间:2017-06-01 07:00:50

标签: swift linux macos cross-compiling

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

我正在考虑将-target传递给swift命令并传递另一个参数以使其静态链接所有依赖项,但我不确定具体命令是什么。

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

我是否需要知道确切的目标分布才能将正确的字符串传递给-target参数?

2 个答案:

答案 0 :(得分:12)

阅读github

上的来源
  • 目标是Linux
  • 机器将是x86_64

主要由build script

调用

这是如何回答问题的一部分

  

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

为可以重新定位Linux的Mac OSX安装GCC工具链,例如我可以看到的一个仓库是OSXCross

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

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

答案 1 :(得分:2)

  

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

简短的回答?当然如此!当你把心投入其中时,一切皆有可能!

这是否有效?本质上,没有。

虽然我确信这里的每个人都熟悉编译器的功能,但为了这个问题及其最新用户,编译器是一个转换人类可读代码并映射它的应用程序到计算机可以理解的二进制格式。但值得一提的是,并非所有计算机都是相同的。每个计算机操作系统具有与另一个不同的二进制映射,因此像复制值这样的简单操作可以在一台机器上表示为1010,在另一台机器上表示为0101。如前面许多问题and for example this one中所述,许多编程语言在各种机器上都是 可构建 ,但很少有可移植< / em>跨越它们,因为每台计算机都有不同的二进制映射。

~~~~~~~ 那么我们如何解决这个问题? ~~~~~~~

  • 有很多解决方案可以解决这个问题。最明显的 方法是简单地使您的环境成为目标环境和 根据自己的内心构建您的计划。你显然已经做到了 这通过虚拟机,这通常是很多 开发人员会这样做这是迄今为止最简单的解决方案 打败你想要简单建立的问题的目的 来自您的OSX机器。

早些时候你说你听过有人在谈论在Linux机器上编译windows程序。 Cygwin是一个开发平台,旨在获取Linux机器上通常不存在的Windows框架,并允许使用Windows框架构建许多程序。然而,它所做的只是添加二进制文件,以便编译器在配置中找到仅Windows命令时有一些适当的映射位置。它所做的就是引入程序成功移植所需的二进制配置。这与第二种选择有关。

  • 其次是支持跨平台编译的编译器。 虽然我目前不知情和/或不熟悉这样的 编译器,这在技术上是一个有效的解决方案,但我会称之为 可靠?可能不是。如果有的话,你只需要添加更多的工作 你的编译器不仅必须正确映射语法 一台计算机的计算机程序,它必须浪费时间链接 它到新的二进制文件。另外你需要拥有 编译器记住这些链接可能会浪费更多 有这个编译器的内存空间。

即使这样,像这样的系统也很少,它的保证是否有效取决于编译器维护者对其内容的了解程度,更新频率等等等等。并且他们甚至可以执行以纠正映射的机会首先,二进制文件不是我生活中的重点。

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

Docker为容器到容器通信,应用程序示例提供了一个有趣的框架,并且有一个相当简单的文档,值得一看,看看你的项目是否可以把它的一些部分移植到docker。

话虽如此,有多种方法可以解决您目前面临的问题,因此当您是软件工程师时,您可以通过最理想的方式处理您的项目。

//编辑//

一旦我感到疲惫不堪就会编辑这个更好的回应。