C++ 找不到共享库

C++ 找不到共享库,c++,c,shared-libraries,dynamic-linking,software-distribution,C++,C,Shared Libraries,Dynamic Linking,Software Distribution,我有一个使用许多共享库的程序。我可以在用来编译程序的机器上很好地编译和运行程序。当我试图将可执行文件复制到另一台机器上,并在通过apt get安装所需的软件包后运行它时,我会遇到以下错误: “加载共享库时出错:libconfig++.so.8:无法打开共享对象文件:没有此类文件或目录” 运行$locate libconfig++.so后,我了解到我在当前系统上安装了libconfig++.so.9,而不是libconfig.so.8 然后,我将所有共享库与可执行文件一起手动复制到新系统中,程序运

我有一个使用许多共享库的程序。我可以在用来编译程序的机器上很好地编译和运行程序。当我试图将可执行文件复制到另一台机器上,并在通过apt get安装所需的软件包后运行它时,我会遇到以下错误:

“加载共享库时出错:libconfig++.so.8:无法打开共享对象文件:没有此类文件或目录”

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

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

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


我也考虑过这样一个事实,即我在分发我的程序的方式上做了一些完全错误的事情。有没有一种方法可以完全避免我的程序的分发?

回答上一段中的问题:分发二进制文件(特别是依赖于共享对象的二进制文件)的标准方法是使用目标分发版的包管理系统(dpkg、rpm或两者)。这些包格式将要求系统安装依赖项(在您的情况下为libconfig++)。如果没有,用户可以使用apt/yum自动下载并安装它们。

如果makefile要求加载版本9共享库,请验证您的makefile

它取决于程序调用的函数的用法

假设在库的8-9版本之间调用的w.r.t函数没有重大变化,则不需要潜在地复制库

当然,创造象征性的喜欢

如果您认为,您的程序不应该依赖所有这些东西


对于静态库,您可以找到libconfig.a归档文件,您可以链接到您的程序,因此在运行其他机器时没有依赖关系

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

这意味着它只适用于x系列库。如果发行版提供的更新版本具有相同的主版本(例如libsomelibrary.x.z),则应用程序应能正常工作

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

TL'DR:

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

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


有关这方面的更多深入信息,请参见

大多数Linux程序使用源代码重新分发,它们是作为安装过程的一部分进行编译的。你想要的是“linux二进制再分配”-只需在Google中键入此内容并享受阅读-这是一个复杂的问题。@Sathish:不,不要这样做。版本控制方案的存在是有原因的,绕过它是愚蠢的,因为你知道版本的改变是因为ABI改变了。@Zachary:在目标机器上构建,如果在不同的系统上编译二进制文件,并且需要目标系统的repoYes@JonathanWakely中没有的包版本,那么这就没有帮助了。实际上,我提到的是二进制文件的标准分发机制。我在回答中加了这个。谢谢