程序使用两个冲突的共享库

时间:2017-02-19 17:07:56

标签: c shared-libraries dynamic-linking

我有一个共享库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(我不知道如何验证这一点)。谁能帮我吗?如果我想这样做,我该怎么办?更改链接顺序?

1 个答案:

答案 0 :(得分:1)

  

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

在UNIX上(与Windows DLL不同),共享库是一个独立的单元,并不是孤立运行的。 UNIX共享库的设计是尽可能地模拟归档库。其中一个后果是(默认情况下)第一个定义的函数" wins"。在您的情况下,libnl-3libnl-1可能会定义相同的功能,并且您将从首先的任何库中获取定义(对于一次调用,这将是错误的或者其他)。

  

更改链接顺序?

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

那么,应该你做什么?

最好的选择 not 来链接同一个库的不兼容版本。选择libnl-1libnl-3中的一个,坚持

如果您不能, 可以<{1}}与A.so关联,或者-Bsymbolic使用{ {1}}查找所需的bar函数,而不是直接使用它。