【问题标题】:Program use two conflicting shared libraries程序使用两个冲突的共享库
【发布时间】:2017-02-19 17:07:56
【问题描述】:

我有一个共享库A.so。其中定义了一个函数foo()。这个foo() 函数依赖于共享库libnl-1.so。关系如下:

A.so 
    {
      foo() => libnl-1
    } 

我有一个程序app。它调用两个函数,foo()bar()bar() 需要另一个版本的 libnl,libnl-3。关系如下:

app {
      foo()
      bar() => libnl-3
    }

我使用cc -o app -lnl-3 -lA 编译了应用程序。但我发现我的应用程序总是崩溃。似乎foo() 正在调用 libnl-3 而不是 libnl-1 (我不知道如何验证这一点)。谁能帮我吗?如果我想这样做,我该怎么办?更改链接顺序?

【问题讨论】:

  • 您可以使用$ LD_DEBUG=all ./app 来检查动态链接器从何处将符号导入您的程序。
  • 为什么你认为同时链接一个库的两个版本是个好主意?你真的需要重新考虑你在做什么,以便只使用一个版本的库,最好是最新的。
  • 为什么stackoverflow.com/questions/228117/… 的答案对您的情况没有用处? (我在这里假设您不能只 C&P 库中需要的两个函数,因为它们是封闭源代码或其他)

标签: c shared-libraries dynamic-linking


【解决方案1】:

如果我想这样做,我应该怎么做?

在 UNIX 上(与 windows DLL 不同),共享库不是一个独立的单元,并且不能单独运行。 UNIX 共享库的设计是尽可能地模拟归档库。结果之一是(默认情况下)第一个定义的函数“获胜”。在您的情况下,libnl-3libnl-1 可能定义了相同的函数,并且您将从 first 的任何库中获取定义(对于一个调用或另一个调用都是错误的)。

更改链接顺序?

这将改变第一个库,并且仍然是错误的。

那么,应该做什么呢?

最好的选择是链接同一库的不兼容版本。选择libnl-1libnl-3 之一并坚持下去

如果不能,您也许可以通过将A.so-Bsymbolic 链接,或者通过使bar 使用dlopen("libnl-3.so", RTLD_LOCAL|RTLD_LAZY) 来查找所需的libnl-3 来实现所需的结果函数而不是直接使用它。

【讨论】:

    猜你喜欢
    • 2011-05-22
    • 1970-01-01
    • 2021-01-19
    • 1970-01-01
    • 1970-01-01
    • 2015-03-26
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    相关资源
    最近更新 更多