c++ - 找不到共享库

标签 c++ c shared-libraries dynamic-linking software-distribution

我有一个使用大量共享库的程序。我可以在用于编译程序的机器上编译和运行程序。当我尝试将可执行文件复制到另一台机器并在通过 apt-get 安装所需的软件包后运行它时,出现以下错误:

"error while loading shared libraries: libconfig++.so.8: cannot open shared object file: No such file or directory"

运行 $ locate libconfig++.so 后,我了解到我在当前系统上安装了 libconfig++.so.9,而不是 libconfig.so.8。

然后我手动将所有共享库连同可执行文件一起复制到新系统,然后程序运行正常。我认为这不是一个长期的解决方案,因为图书馆不会像往常一样收到补丁和更新,从而产生潜在的安全风险。

有什么方法可以编译我的程序,使其依赖于 libconfig++.so 而不是 libconfig++.so.x,或者有什么方法可以让我手动包含特定的共享库,同时仍然可以更新它们?

我还考虑了这样一个事实,即我在分发我的程序时做的事情完全错误。有没有办法以完全避免这种情况的方式分发我的程序?

最佳答案

当您使用 -lsomelibrary 编译您的程序时,编译器将在您的系统中搜索 libsomelibrary.so,它将链接到类似 libsomelibrary.so.x.y 的内容从现在开始,您的软件将绑定(bind)到该特定 主要 版本(名称中的 x)。

这意味着它只能与 x 系列库一起使用。如果发行版发布了具有相同主要版本的较新版本(例如 libsomelibrary.x.z),您的应用程序应该可以正常工作。

但是,您不允许使用该库的另一个主要版本。如果你这样做(通过将主要版本链接到不同的版本),就像这里有人建议的那样,应用程序可能会启动(或者可能会在开始时崩溃),但你永远无法确定应用程序是否会按计划工作。

TL'DR:

编译时,链接器会查找 libsomelibrary.so,它将链接到特定版本,如 libsomelibrary.so.x.y。

当您运行您的应用程序时,系统将查找 libsomelibrary.so.x.*(相同的主要版本,任何次要版本)

有关该问题的更多详细信息,请参阅 http://www.ibm.com/developerworks/linux/library/l-shlibs/index.html

关于c++ - 找不到共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25262860/

相关文章:

c++ - ios::trunc 如何在 C++ 中为二进制文件工作?

c - 使用指针写入/读取文件,C

c - 使用金丝雀值的堆栈损坏检测

C++文件输出奇怪的数字,部分代码没有运行

c++ - 验证以下条件的输入

c++ - 来自 vector 的 glDrawArrays 和 GL_LINE_STRIP 的折线图

c - NVCC:警告:允许所有异常与以前的功能不兼容

android - 如何在 Android Studio 1.5 中包含 .so 库和 .c 文件

gcc - 从 LD 隐藏共享对象中的符号

c++ - 加载 boost 的共享库时出错