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

Gio*_*hal 11 c++ portability portable-executable static-linking

好的,这个问题是关于便携式的,因为没有依赖关系(即"我可以将二进制文件放在USB密钥中,随身携带,发送给朋友等等").

我听说过静态连接,但我很困惑它的后果是什么; 什么可以和什么不能静态链接(即Qt,OpenGL,libstdc ++怎么样?)以及之后二进制将"可移植"的程度.

我也听说过LSB(Linux标准基础版),但我不确切地知道它是什么,或者它在这个意义上是否有帮助.

Fre*_*Foo 7

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

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

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


Jam*_*nze 5

您不必以相同的方式链接所有库。我绝对会坚持动态链接libc和其他系统库。并对任何C ++使用静态链接;二进制API确实会不时更改,并且您需要确保该库的版本与针对其进行编译的版本相同-最可靠的方法是将库静态链接到您的可执行文件。如果您使用的任何其他库都是用C ++编写的,则可能要在本地编译它们,而不是使用预编译的发行版,以确保它们是针对相同的二进制API进行编译并静态链接的。C的二进制API是固定的,因此您拥有更大的自由度:如果该库将在每次安装中都存在,并且必须具有与操作系统版本兼容的版本,并且可以动态链接;否则,静态地。

  • -1。GNU libc显然不是为了向前兼容而设计的。如果您链接到最新的libc,则程序将在启动时检查该版本或更新的版本,因此它将无法在任何较旧的Linux发行版上运行。 (2认同)