2017-06-01 113 views
13

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

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

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

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

+0

也许我误解了你的问题,但是linux二进制(elf)和mac二进制(mach-o)[不兼容](https://stackoverflow.com/questions/9439436/is-a-linux-executable-兼容-与-OS-X)。 – TheDarkKnight

+0

是的,显然他们不是。交叉编译意味着从一个os编译到不同的目标os。例如,工作形式为一个linux盒子,并编译为一个Windows兼容的exe。我以前没做过,但我看到有人谈论做这种事情,所以我认为这是可能的。 – hasen

+0

我并不认为这在OS X上与本机Apple编译器是可能的,但会感兴趣地观看这个问题。 – TheDarkKnight

回答

11

从阅读github

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

这得到由初级build script

叫这怎么过答案的一部分的问题

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

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

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

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

+0

谢谢OP。 :) – t0mm13b

1

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

简短的回答?当然如此!任何事情都是可能的,当你放下心扉时!

效率高吗?本质上,没有。

虽然我相信在座的各位是熟悉的编译器做什么,对这个问题的目的和其最新的用户,编译器是一种将人类可读的代码,并将其映射到一个二进制格式的应用一台电脑可以理解。但值得一提的是,并非所有的计算机都是一样的。每个计算机操作系统都有不同的二进制映射,因此像复制值这样的简单操作可以在一台机器上表示为1010,在另一台机器上表示为0101。正如在许多问题事先如前所述,and for example this one,很多编程语言都可建在各种机器,但他们很少有碰到他们便携式因为每台计算机都有一个不同的二进制映射。

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

  • 那么有解决这个问题的一些解决方案。最明显的方法是简单地让你的环境成为目标环境,并且 建立你的程序给你的内心。你很明显已经通过虚拟机做了这个 ,这通常是许多开发者会做的事情。这是迄今为止最简单的解决方案,但它打破了您希望从OSX机器简单构建 的问题的目的。

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

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

即使这样,像这样的系统是寥寥可数,以及是否其保证的工作依赖于编译器的维护者如何知道自己的东西,怎么他们经常更新等等,等等,他们甚至执行的机会首先解决二进制文件的映射并不是我想要的。

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

泊坞窗提供容器容器通信,应用实例一个有趣的框架,并有一个相当简单的文档,这将是值得期待的,看看你的项目可能有它的一些部件移植到泊坞窗。

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

// //编辑

将编辑这是一个更好的响应一次,林不落累得要死。

+0

Cygwin不适用于Windows上的Windows应用程序,它适用于Windows上的Linux应用程序(btw感谢链接,所以我不必使用Google;)) – Markaos

+0

此外,服务器可能不使用Swift的部分, t在Linux上可用(像GUI库,我猜),所以它应该是有效的 – Markaos

+0

@Markaos我知道它不是什么cygwin的。我指的是这样一个事实,即它添加了您从编码的角度来看需要的二进制文件,您无法在其他地方接收这些二进制文件。如果你是一个在linux上工作的C++编码器,并且你希望你的应用在windows上运行,那么你需要一些二进制包,Windows和Linux都没有。我在cygwin的印象下解决了这个问题。我所指的效率就是在内存,时间和复杂性方面做出原始问题所需的解决方法。 – Jouster500