使用c ++可执行文件的不同Linux发行版的问题

时间:2010-01-26 17:11:26

标签: c++ merge shared-libraries linux-distro

我有一个在我的linux机器上运行完美的c ++代码(Ubuntu Karmic)。 当我尝试在另一个版本上运行它时,我丢失了所有类型的共享库。

有没有办法将所有共享库合并为单个可执行文件?

编辑: 我想我问的是错误的问题。我应该要求一种方法来静态链接我的可执行文件已经构建。 我在ermine& statifier

6 个答案:

答案 0 :(得分:6)

缺少共享库有三种可能的原因:

  • 您正在使用默认情况下在另一个发行版上不存在的共享库,或者您已在主机上安装它们,而不是在另一个上安装它们,例如libDBI.so
  • 您在链接时过度指定了版本,例如libz.so.1.2.3和另一台计算机有API兼容(主要版本1),但不同的次要版本2.3,如果只是链接,可能适用于您的程序
  • 该库的主要版本已更改,这意味着它与libc.so.2libc.so.1不兼容。

修正案是:

  • 不要将不需要的库链接到不同的发行版上,或者在其他机器上安装其他库,手动或使它们成为安装程序包的依赖项(例如使用RPM)
  • 不要在命令行上如此紧密地指定版本 - 链接libz.so.1而不是libz.so.1.2.3
  • 针对不同的libc版本编译多个版本。

答案 1 :(得分:4)

您所描述的是使用静态库而不是共享库。

答案 2 :(得分:2)

这里提到的原始问题有几种技术解决方案,例如:

  

编译多个版本   不同的libc版本。

  

安装附加库   其他机器

但如果您处于ISV的位置,那么实际上只有一个理智的解决方案:

彻底安装较旧的系统(例如,如果你的目标是桌面,可能是Ubuntu 6.x,如果你的目标是服务器,可能早在红帽9上),并在其上构建你的软件。通常库(并且肯定是libc)是向后兼容的,因此您在新系统上运行时不会遇到问题。

当然,如果您有非标准或最新版本的lib依赖项,这并不能完全解决问题。在这种情况下,正如其他人所建议的那样,如果你想要健壮,最好是dlopen()并报告问题(或运行功能减少)。

答案 3 :(得分:1)

我不太确定,但您可能希望通过静态链接所有库来创建可执行文件。

答案 4 :(得分:1)

另一种选择是使用dlopen()的{​​{3}}共享库,如果加载失败,请正常退出,并显示可执行文件工作所需的依赖库。 然后,用户可以安装适当的库。

答案 5 :(得分:1)

另一种可能的解决方案是使用statifier(http://statifier.sf.net)或Ermine(http://magicErmine.com) 它们都能够将动态可执行文件和所有需要的库打包成一个自包含的可执行文件