2014-10-28 82 views
2

有没有办法动态链接有依赖关系的共享库?动态链接共享库与依赖关系

例如,我有两个库,libA.so和libB.so. libB.so调用libA.so中定义的函数。

在我的主程序中,我希望用dlopen加载这两个库。但是,如果我尝试:

dlopen(libA.so); 
dlopen(libB.so); 

然后第二个dlopen将失败,因为libB具有无法识别的符号。

我可以想到一些解决方法,比如将所有的目标文件构建到一个共享库中,或者让libB.so在libA.so上调用dlopen,但这是额外的工作。

我想我想象这个工作的方式就像在内核模块的情况下,你可以使用“EXPORT_SYMBOL()”来允许其他模块调用在以前加载的模块中定义的函数。

可以用共享库做类似的事情吗?或者我将不得不使用我的解决方法?

回答

2

我经历了类似的情况,这是对我工作(使用gcc工具):

当您创建的共享对象libB.so,你无条件链接库libA.so,命令应该是这样的:

gcc -shared -Wl,--no-as-needed -lA -o libB.so b.o 

然后,您可以检查libA.so确实成为了动态链接的相关性:

$ ldd libB.so 
    linux-gate.so.1 => (0xb77ba000) 
    libA.so => not found 
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75f7000) 
    /lib/ld-linux.so.2 (0xb77bb000) 

在你的主程序中,应该只需要dlopen()libB.so,另一个库应该由动态链接器自动链接。

+0

谢谢!这正是我想要的 – Tony 2014-10-30 21:05:47

0

您是否尝试过使用RTLD_GLOBAL?通过该库中定义

RTLD_GLOBAL 的符号将被提供用于随后加载库的符号解析。

这应该很好地工作,即使B依赖于答:

void * const handleA = dlopen("libA.so", RTLD_NOW | RTLD_GLOBAL); 
void * const handleB = dlopen("libB.so", RTLD_NOW);