为所有Linux发行版编译C++

11

如何将我的C++文件编译成在所有Linux发行版上都可以运行的代码。 我将在Ubuntu 10.10上编译这些文件。

如果我在Ubuntu 10.10上编译,它们是否也能在其他发行版上正常工作,例如ubuntu、fedora、debian、非debian发行版等?

4个回答

9
% gcc -o foo foo.c -static

生成的二进制文件应该可以在大多数发行版上运行,只要它们在相同的架构上运行(64位、32位、ARM、MIPS等)。

主要问题在于:由于您事先不知道目标系统上会有什么,因此您必须将所有可能的东西捆绑到您要发布的二进制文件中,或者将其放在某种“chrooted”环境中,在那里您可以部署外部库(无法静态链接的内容),然后使用包装器来使用您部署的库而不是系统库。


3
这对于C语言可以工作,但不适用于C ++。请参阅http://www.trilithium.com/johan/2005/06/static-libstdc/。 - Nemanja Trifunovic

4

虽然@akira的回答可能适用于您的情况,但它并不是最好的解决方案。大多数Linux发行版都有打包系统,可以为您检索依赖项。

如果您认真考虑编写在其他人的计算机上使用的Linux软件,您将需要研究“GNU Autotools”,这就是驱动“./configure && make all && make install”所需的东西,您现在已经运行了多次!


1
这个项目不是开源的吗? - Daniel
@Daniel,即使你不免费提供代码,使用Autotools仍然是更好的选择!否则,当你的代码依赖的库发生变化时,你的生活将变得困难。但像@akira所说的那样,这个想法很可能会达到你的目的。 - Chris Huang-Leaver
如果他的项目需要Autotools,而Autotools是GPL下的,即使只是在分发之前构建软件,他自己的软件是否可以使用GPL不兼容的许可证?(这是一个认真的问题,不是GPL挑衅。) - gotgenes
1
如果您只分发二进制文件,那当然是合法的。GPL涵盖“派生作品”,这意味着“剪切和粘贴”源代码以创建新东西,而不是使用工具来帮助您完成其他事情。同样,使用Word并不会使Microsoft对您的小说拥有版权。 - Chris Huang-Leaver

2

1

只要您仅使用Linux标准库中列出的库,动态可执行文件应该是可以的。

对于其他库,请链接它们的静态版本或者提供动态库;我更喜欢前者。

个人建议避免静态链接C库,因为这会阻止一些由其提供的有用功能工作,例如nss等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接