我有一个使用大量共享库的程序。我可以在用于编译程序的机器上编译和运行程序。当我尝试将可执行文件复制到另一台机器并在通过 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/