为多个平台构建linux二进制文件

时间:2013-04-27 10:11:46

标签: c++ linux portability

帮我解决问题。

我有一个用C ++编写的软件,它可以在尽可能多的Linux发行版上运行,我需要找出一个有效的策略。我试图在这种情况下发送二进制文件而不是源代码(可能很高兴知道)。 它已经是商业产品,我有知识产权问题阻止我公开采购产品,但也意味着我必须处理无数的GPL问题。

目前的推理方法是选择一个最不常见的分母并将其全部构建出来。这有两个主要含义,我觉得反效果。

  1. 旧版GCC中的C ++支持缺少一些更现代的C ++功能。
  2. 最不常见的分母需要红帽企业Linux 4(RHEL4)
  3. 我绝对不需要整个C ++ 11功能集,但我想将C ++支持带到Visual C ++ 2010的支持。我正在仔细考虑使用Clang / libc ++而不是GCC / libstdc ++尽可能。

    RHEL4似乎没有为构建C ++应用程序提供广泛的跨平台支持,更重要的是,我对不同版本的linux中ABI的稳定性几乎没有任何了解,但我担心RHEL4比值得更麻烦。尝试基于少数几种方法构建所有发行版并不是一种可行的策略。

    我假设通过在目标平台上使用工具编译目标平台的软件来最好地完成针对不同Linux发行版的软件编译。我目前也在假设如果你不接受这个问题,你会遇到跨越Linux平台的大量可移植性问题。不要谈论由于跨平台/发行版的C ++ ABI不稳定而可以或不能链接的许多库。

    但我可能错了,我想听听那些定期处理这件事的人。什么会起作用,为什么?或者更重要的是,哪些不起作用?

3 个答案:

答案 0 :(得分:7)

您可能会尝试关注几个主要平台而不是单个发行版。我的意思是建立在我称之为“基础发行版”(Debian和RedHat)的基础上,并希望在其他人身上做到最好。

最有可能的是,Debian二进制文件(静态链接)在Ubuntu和Mint以及其他Debian派生的发行版上运行得很好。 RedHat二进制文件可能运行在Centos,Scientific Linux和SuSE Linux上。如果你关心不太受欢迎的发行版(假设你有很多客户运行一些不常见的Linux),并且你的Debian或RedHat可执行文件都不能正常工作或者可以以某种方式工作,那么设置一个该发行版的虚拟机并构建一个可执行文件特别是那种味道。

我过去采用过这种方法,效果很好。

答案 1 :(得分:4)

最好的办法是让你的软件成为开源的free software(例如GPLv3 +许可证),然后如果你的软件足够有趣,它将被打包成发行版(由发行版维护者)。< / p>

您总是希望为Ubuntu或Debian提供分发包(例如.deb文件),因为这些文件是最容易安装的。

如果您仍想制作专有软件(但问问自​​己是否能够出售,甚至免费分发,成功您的软件),您可以采取以下步骤:

  • 通过启用静态stdc ++&amp;编译最近的GCC编译器(例如4.8)。静态libgcc(大多数发行版都提供GCC不这样做。)

  • 可能是静态链接您的程序(但您可能无法执行此操作,例如/etc/nsswitch.conf相关功能,包括getaddrinfo和相关DNS服务。

即使通过静态链接所有与C ++相关的东西,你依然依赖libc.so.6,然后你可能会遇到一些Gnu Libc版本问题(因此为libc版本2.17编译的二进制文件并不总是使用libc 2.16或反之亦然)。还要注意GNU libc通常与某些内核版本绑定(你不能在一些非常老的内核上使用最近的libc)。你可以考虑一些替代的libc,如MUSL libc

顺便说一句,你通常可以使用一些chroot - 目标环境(你可以在其中安装一些其他发行版,例如debootstrap

答案 2 :(得分:2)

如果有人好奇我们通过在RHEL 4.8 dist之上构建GCC 4.8工具链来解决问题,该工具链仍然是我们的构建代理。

概述了here。问题稍微简单一点,因为我们不需要一个功能齐全的交叉编译器。只是目标主机上的GCC 4.8工具链。

互操作性仍然很痛苦,因为这个旧版本的Linux几乎不支持SMB和/或其他技术。我们最终得到了一个Bash脚本,它将构建输出放在FTP服务器中,这种方法运行得相当好。它解决了主要的痛苦。