如何链接特定名称(版本)的共享库

问题描述:

我在这里搜索这个问题,并找到一些类似的问题,但有解决方案不适合我。这是我的问题: 我的应用程序正在使用openldap-2.3的共享库进行编译。 Openldap的/usr/lib/libldap-2.3.so.0链接到/usr/lib/libldap-2.3.so.0.2.31。我将-lldap选项传递给gcc,它将libldap-2.3.so.0文件链接到我的应用程序。如何链接特定名称(版本)的共享库

但我想链接像libldap.so这样的特定名称。 请改正我,将来如果我在开发系统中将openldap版本更改为2.4,则它将链接到libldap-2.4.so.XXX版本。

那么我怎样才能将我的应用程序链接到特定的名称,以便它会一直寻找像libldap.so一样的名称。

注:我创建/usr/lib/libldap-2.3.so.0的软链接作为/usr/lib/libldap.so,然后通过库名/usr/lib/libldap.so没有-l编译器,然后应用程序编译成功,而不任何链接错误,但依然显示相同的libldap-2.3.so.0。

+1

在未来,如果您更改库,您可以将链接更改为指向新链接,是不是会解决问题? – iabdalkader

+1

只是一个猜测 - 所以没有可能与一些普通图书馆链接。它总是需要与特定版本的库链接。如果您更改系统,则需要重新构建应用程序。另一种可能性不是链接到共享库,而是使“静态”应用程序 – xhudik

+0

@mux我在gcc中使用“-l”选项,因此它会将我的应用程序链接到libldap-2.4.so.0等新库,但它会询问在我运行我的应用程序的系统中使用相同的名称。我想要修复。 – linuxexplore

Unix中的shared library mechanism(该链接很古老,但仍然相关)通过在构建时将可执行文件链接到例如liba.so,它是liba.so.1的一个符号链接,它又是链接到liba.so.1.2的链接。然后可执行文件记录liba.so.1以在启动时加载。如果你更新liba.so,它可能是liba.so.1.5(没有ABI更改,第一位数字不会更改),链接看起来像liba.so - > liba.so.1 - > liba.so .1.5,并且您的可执行文件现在透明地使用1.5。如果版本转到liba.so.2.0(API更改!),则系统将使liba.so - > liba.so.2 - > liba.so.2.0。您的旧可执行文件仍然使用1.5,任何新建立的程序现在都会引用2.所有这些工作只要1.x一直存在,显然。假设您的发行版提供了可以并行安装的库软件包,或者为了旧的可执行文件而使用某些compat-liba-1软件包。