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



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

然后,我将所有共享库和可执行文件手动复制到新系统,然后程序运行正常。我不认为这将是一个长期的解决方案,因为这些库将不会收到它们通常会收到的补丁和更新,从而造成潜在的安全风险。

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

我还考虑了一个事实,就是我在分发程序时做错了什么。有没有一种方法可以完全避免这种情况来分发我的程序?

最佳答案

当您使用-lsomelibrary编译程序时,编译器将在系统中搜索libsomelibrary.so,该程序将链接至libsomelibrary.so.xy之类的东西。从现在开始,您的软件将与该特定的主要版本(即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/

10-12 16:04