我有一个共享库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(我不知道如何验证这一点)。谁能帮我吗?如果我想这样做,我该怎么办?更改链接顺序?
答案 0 :(得分:1)
如果我想这样做,我该怎么办?
在UNIX上(与Windows DLL不同),共享库不是一个独立的单元,并不是孤立运行的。 UNIX共享库的设计是尽可能地模拟归档库。其中一个后果是(默认情况下)第一个定义的函数" wins"。在您的情况下,libnl-3
和libnl-1
可能会定义相同的功能,并且您将从首先的任何库中获取定义(对于一次调用,这将是错误的或者其他)。
更改链接顺序?
这将改变第一个库,并且仍然是错误的。
那么,应该你做什么?
最好的选择 not 来链接同一个库的不兼容版本。选择libnl-1
或libnl-3
中的一个,坚持。
如果您不能, 可以<{1}}与A.so
关联,或者-Bsymbolic
使用{ {1}}查找所需的bar
函数,而不是直接使用它。