我有一个可以在我的 linux 机器(Ubuntu Karmic)上完美运行的 c++ 代码。当我尝试在另一个版本上运行它时,我缺少各种共享库。
有没有办法将所有共享库合并到单个可执行文件中?
编辑:我想我问错了问题。我应该要求一种方法在我的可执行文件已经构建时对其进行静态链接。我在ermine & statifier中找到了答案
缺少共享库的可能原因有 3 个:
libz.so.1.2.3
,另一台机器具有 API 兼容(主要版本1
)但不同的次要版本2.3
,如果只有它会链接,它可能会与您的程序一起使用libc.so.2
与libc.so.1
.修复是:
libz.so.1
而不是libz.so.1.2.3
.您所描述的是使用静态库而不是共享库。
这里提到的原始问题有几种技术解决方案,例如
针对不同的 libc 版本编译多个版本。
或者
在其他机器上安装附加库
但是,如果您处于 ISV 的位置,那么实际上只有一个明智的解决方案:
获得一个旧系统的全新安装(例如,如果您以桌面为目标,则为 Ubuntu 6.x,如果您以服务器为目标,则可能可以追溯到 Red Hat 9)并在此基础上构建您的软件。通常库(当然还有 libc)是向后兼容的,因此在较新的系统上运行不会有问题。
当然,如果您有非标准或最新版本的 lib 依赖项,这并不能完全解决问题。在这种情况下,正如其他人所建议的那样,如果您想变得健壮,最好使用 dlopen() 并报告问题(或以减少的功能运行)。
我不太确定,但您可能希望通过静态链接所有库来创建可执行文件。
一种替代方法是使用动态加载共享库dlopen()
,如果加载失败,则优雅地退出并显示可执行文件需要依赖库才能工作的消息。
然后用户可以安装适当的库。
另一种可能的解决方案是使用 statifier (http://statifier.sf.net) 或 Ermine (http://magicErmine.com) 它们都能够将动态可执行文件和所有需要的库打包到一个自包含的可执行文件中