将C ++编译成可移植的Linux二进制文件

时间:2011-04-06 09:05:29

标签: c++ portability static-linking portable-executable

好的,这个问题与无依赖中的可移植有关(即“我可以将二进制文件放入USB密钥并随身携带,电子邮件他们对朋友等“)。

我听说过静态链接,但我对它的确切后果感到困惑;什么可以和什么不能静态链接(即Qt,OpenGL,libstdc ++怎么样?)以及之后二进制文件“可移植”的程度。

我也听说过 LSB (Linux Standard Base),但我不确切地知道它是什么,或者从这个意义上它是否有帮助。

4 个答案:

答案 0 :(得分:7)

静态链接适用于大多数库,但不适用于使用动态加载模块的库。试试看它是否有效。您可能仍然遇到内核兼容性问题;您的程序可能正在使用旧内核中不可用的系统调用。

一些Linux发行版支持Linux标准版,但在Debian(我认为也是Ubuntu)它必须从一个软件包安装。它还处理大多数管理事务,如启动脚本,虽然它有一些二进制兼容的东西。有关详细信息,请参阅this page

对于“佩戴USB密钥并随处运行”的要求,请查看CDE

答案 1 :(得分:5)

您不必以相同的方式链接所有库。 ID 肯定坚持使用libc和其他的动态链接 系统库。并使用静态链接来处理任何C ++;该 二进制API确实会不时发生变化,您需要这样做 确保库的版本与版本相同 你编译的反对---最可靠的方法就是这样做 将库静态链接到您的可执行文件中。如果有的话 您使用的其他库是用C ++编写的,您可能也是 想要在本地编译它们,而不是使用它们 预编译的分发,以确保它们被编译 针对相同的二进制API,并静态链接它们。该 C的二进制API是固定的,所以你有更多的自由:如果 库将在每个安装中出现,并且必须 有一个与操作系统版本兼容的版本,链接 动态;否则,静态地。

答案 2 :(得分:1)

使用gcc时要注意静态链接,它不再起作用了。 See

答案 3 :(得分:1)

让你失望:没有解决方案。那个静态链接就在那里,你可以(如果你想的话)链接一切static =>将删除其他库中的所有依赖项。但还有其他依赖关系,无法避免:首先是架构。我们在这里有PowerPC上的linux,ARM上的linux,Microblaze上的linux,32位x86上的linux和64位x86上的linux。其次是ABI和那里的系统调用。那些可以(并且实际上在过去)有变化(例如旧系统上不存在异国情调/新系统调用 - 如果你在二进制文件中得到那些调用,那么你的程序就不会工作)。

LSB只是一个标准(或者更好,它试图成为 - 不是每个人都遵循它),因为不同的发行版可以使管理,使用和维护(有时候开发)变得更容易。定义存储文件的位置。它的目的不是使可执行文件更具可移植性。

相关问题