构build多个平台的Linux二进制文件

帮我解决一个分数。

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

目前的推理线是select一个最不起眼的分母,并把所有东西都build立起来。 这有两个主要的含义,我觉得反作用。

  1. 旧版GCC中的C ++支持缺less一些更加现代的C ++特性。
  2. 最不共同点是红帽企业Linux 4(RHEL4)

我绝对不需要整个C ++ 11function集,但是我想把C ++支持提高到Visual C ++ 2010.我正在细读使用Clang / libc ++而不是GCC / libstdc ++在可能的情况。

对于构buildC ++应用程序,RHEL4似乎没有广泛的跨平台支持。对于不同版本的Linux中ABI的稳定性,我还没有多less见识,但是我担心RHEL4比麻烦更麻烦。 试图build立基于less数的所有分布是不可行的策略。

我假设编译不同版本的Linux软件最好是通过目标平台上的工具编译目标平台的软件来完成的。 如果你不接受这个,我现在也在假设你将跨Linux平台运行大量的可移植性问题。 不要谈论你可以或不能链接的许多库,因为跨平台/发行版的C ++ ABI不稳定。

但是我可能是错的,我想听取定期处理这个问题的人的意见。 什么工作,为什么? 或者更重要的是,什么不行?

Solutions Collecting From Web of "构build多个平台的Linux二进制文件"

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

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

我过去采取了这种方法,运作良好。

要做到这一点,使您的软件一些开源免费软件 (如GPLv3 +许可证),那么如果你的软件是足够有趣的,它将被分发(由分发维护者)打包。

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

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

  • 编译一个最近的GCC编译器(例如4.8),通过启用一个静态stdc ++和一个静态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 -ed目标环境(你可以在其中安装一些其他的发行版,例如debootstrap

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

关键是这里概述。 这个问题有点简单,因为我们不需要一个功能齐全的交叉编译器。 只需在目标主机上安装一个GCC 4.8工具链。

互操作性仍然是一个痛苦,因为这个旧版本的Linux几乎不支持SMB和/或其他技术。 我们结束了一个Bash脚本,把建立输出在FTP服务器,这工作相当不错。 它解决了重大的痛苦。