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

是否有可能从OS X计算机编译一个swift二进制文件,以便它运行在一个运行Linux的服务器上作为一个单独的二进制文件,而不需要额外的库需要dynamic链接?

-target传递一个-target到swift命令,并传递另一个参数,让它静态链接所有依赖,但我不知道确切的命令是什么。

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

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

从阅读github上的资源

  • 目标是Linux
  • 机器将是x86_64

这由主构建脚本调用

这怎么回答问题的一部分

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

为Mac OSX安装一个GCC工具链,可以重定向Linux,例如,我可以看到一个回放是OSXCross 。

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

不幸的是,这并不能保证它能正常工作,但试试看看会发生什么。

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

简短的答案? 当然如此! 任何事情都可能,当你把你的心!

它有效吗? 本质上,没有。

虽然我确信这里的每个人都熟悉编译器的功能,但为了这个问题和最新的用户, 编译器是一个应用程序,它可以转换人类可读的代码,并将其映射为计算机可以理解的二进制格式。 不过值得一提的是,并不是所有的电脑都是一样的。 每个计算机操作系统都有不同的二进制映射,所以像复制值这样的简单操作可以在一台机器上表示为1010,在另一台机器上表示为0101。 正如之前在许多问题中所说的,例如这个 ,很多编程语言都可以在各种机器上构建 ,但是很少有编程语言是 移植的 ,因为每个计算机都有不同的二进制映射。

~~~~~~~ 那么我们该如何解决呢? ~~~~~~~

  • 那么有一些解决方案来解决这个问题。 最明显的方法是简单地将您的环境作为目标环境,并将您的程序构建到您的心中。 您显然已经通过虚拟机完成了这一切,而这通常是许多开发人员所要做的。 这是迄今为止最简单的解决方案,但它打破了您想从OSX机器上简单构建的问题的目的。

早些时候你曾经说过,你听过有人在讨论在linux机器上编译windows程序的问题。 Cygwin是一个开发平台,旨在获得通常不在linux机器上的windows框架,并允许用windows框架构建许多程序。 然而,它所做的只是添加二进制文件,以便在配置中找到仅限Windows命令时,编译器具有一些适当的映射位置。 它所做的一切就是介绍程序成功移植所需的二进制配置。 这关系到第二个选项。

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

即使这样,这样的系统也是少之又少,它是否保证工作取决于编译器维护人员知道他们的东西的程度,他们更新的频率等等。而且他们甚至执行了纠正二进制文件映射的机会第一个地方不是我想要的。

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

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

这就是说,有多种方法可以解决你当前面临的问题,所以当你成为一名软件工程师时,这对你来说是最理想的处理你的项目的方式。

//编辑//

一旦我不累不累,将编辑这是一个更好的回应。