【发布时间】:2010-12-06 08:04:58
【问题描述】:
如何编译我的 C++ 文件以在所有 Linux 发行版上工作。 我将在其上编译它们的机器是 Ubuntu 10.10
如果我在 Ubuntu 10.10 上编译它们,它们是否可以在其他发行版(如 ubuntu、fedora、debian、非 debian 发行版......等)上运行?
【问题讨论】:
如何编译我的 C++ 文件以在所有 Linux 发行版上工作。 我将在其上编译它们的机器是 Ubuntu 10.10
如果我在 Ubuntu 10.10 上编译它们,它们是否可以在其他发行版(如 ubuntu、fedora、debian、非 debian 发行版......等)上运行?
【问题讨论】:
% gcc -o foo foo.c -static
生成的二进制文件应该可以在大多数发行版上运行,因为它运行在相同的架构(64 位、32 位、arm、mips 等)上。
要点是:由于您事先不知道可以在目标系统上找到什么,因此您必须将所有可以找到的东西捆绑到您正在运送的二进制文件中,或者在您部署的某种“chrooted”环境中外部库也是如此(不能静态链接的东西),然后有某种包装器来使用您部署的库而不是系统库。
【讨论】:
虽然@akira 的回答可能适用于您的情况,但这并不是最好的解决方案。大多数 Linux 发行版都有打包系统,可以为您检索依赖项。
如果您认真编写在其他人的机器上使用的 Linux 软件,您将需要研究“GNU Autotools”,它是驱动您将拥有的“./configure && make all && make install”的东西现在运行不止一次!
【讨论】:
这比它应该做的要难,至少对于 C++:http://www.trilithium.com/johan/2005/06/static-libstdc/
【讨论】:
如果您只使用 Linux 标准库中列出的库,那么动态可执行文件应该没问题。
对于其他库,要么链接它们的静态版本,要么发布动态库;我更喜欢前者。
我个人建议避免静态链接 C 库,因为这会妨碍它提供的一些有用功能,例如 nss 的东西..
【讨论】: