4

我在这里搜索了这个问题并找到了一些类似的问题,但那里的解决方案对我不起作用。这是我的问题:我的应用程序正在使用 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 依赖。

4

1 回答 1

1

共享库机制(链接是旧的,但仍然相关)在 Unix 中通过在构建时将可执行文件链接到例如 liba.so 来工作,liba.so 是 liba.so.1 的符号链接,而 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为了旧可执行文件的利益而打包。

于 2013-02-05T12:37:11.943 回答