10

帮我算一笔账。

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

目前的推理路线是选择一个最小公分母并以此为基础构建一切。这有两个主要的含义,我认为会适得其反。

  1. 旧版本的 GCC 中的 C++ 支持缺少一些更现代的 C++ 功能。
  2. 最小的共同点是 Red Hat Enterprise Linux 4 (RHEL4)

我绝对不需要整个 C++11 功能集,但我想将 C++ 支持提升到 Visual C++ 2010 的支持。我正在仔细研究使用 Clang/libc++ 而不是 GCC/libstdc++ 的想法在可能的情况。

RHEL4 似乎没有广泛的跨平台支持来构建 C++ 应用程序,此外,我对 ABI 在不同版本的 linux 上的稳定性知之甚少,但我担心 RHEL4 麻烦多于价值。尝试基于少数几个发行版构建所有发行版并不是一个可行的策略。

我假设为不同的Linux发行版编译软件最好通过使用目标平台上的工具为目标平台编译软件来完成。我目前还假设如果您不接受这一点,您将在跨 Linux 平台上遇到巨大的可移植性问题。更不用说由于跨平台/发行版的 C++ ABI 不稳定性而可以链接或不能链接的许多库。

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

4

3 回答 3

8

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

很有可能,Debian 二进制文件(静态链接)在 Ubuntu 和 Mint 以及其他 Debian 派生发行版上运行良好。RedHat 二进制文件可能会在 Centos、Scientific Linux 和 SuSE Linux 上运行。如果您关心不太流行的发行版(假设您有很多客户运行一些不常见的 Linux),并且您的 Debian 或 RedHat 可执行文件都不能在它们上运行,或者无法以某种方式运行,那么设置该发行版的 VM 并构建一个可执行文件专门针对那种味道。

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

于 2013-04-27T12:23:12.133 回答
4

最好的方法是让你的软件成为一些开源免费软件(例如 GPLv3+ 许可证),然后如果你的软件足够有趣,它将被打包在发行版中(由发行版维护者)。

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

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

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

  • 可能静态链接您的程序(但您可能无法这样做,例如/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 目标环境(您可以在其中安装一些其他发行版,例如 with debootstrap

于 2013-04-27T10:51:39.037 回答
2

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

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

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

于 2017-02-06T10:40:19.363 回答