【问题标题】:How to link with specific name (version) of a shared library如何链接共享库的特定名称(版本)
【发布时间】:2013-02-05 09:41:36
【问题描述】:

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

【问题讨论】:

  • 以后如果你改变图书馆,你可以只改变链接指向新的,那不是解决问题吗?
  • 只是一个猜测 - 所以不可能链接到一些通用库。它总是需要与特定版本的库链接。如果您更改系统,则需要重新构建您的应用程序。另一种可能性是不链接共享库,而是制作“静态”应用
  • @mux 我在 gcc 中使用“-l”选项,因此它将我的应用程序链接到新库,如 libldap-2.4.so.0 但它会在我所在的系统中要求相同的名称运行我的应用程序。我想要那个修复。
  • @xhudik 添加静态库可以从 openldap 包库中删除依赖项,但它会使我的应用程序更大:-(。我买不起。但感谢您的建议。:-)跨度>

标签: linux gcc linker shared-libraries


【解决方案1】:

Unix 中的shared library mechanism(链接有点旧,但仍然相关)通过在构建时将可执行文件链接到例如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 包以供旧可执行文件使用。

【讨论】:

    猜你喜欢
    • 2010-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-13
    相关资源
    最近更新 更多