我有一个在我的linux机器上运行完美的c ++代码(Ubuntu Karmic)。 当我尝试在另一个版本上运行它时,我丢失了所有类型的共享库。
有没有办法将所有共享库合并为单个可执行文件?
编辑: 我想我问的是错误的问题。我应该要求一种方法来静态链接我的可执行文件已经构建。 我在ermine& statifier
答案 0 :(得分:6)
缺少共享库有三种可能的原因:
libz.so.1.2.3
和另一台计算机有API兼容(主要版本1
),但不同的次要版本2.3
,如果只是链接,可能适用于您的程序libc.so.2
与libc.so.1
不兼容。修正案是:
libz.so.1
而不是libz.so.1.2.3
。答案 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) 它们都能够将动态可执行文件和所有需要的库打包成一个自包含的可执行文件