gpt4 book ai didi

c++ - 具有依赖关系的共享库的动态链接

转载 作者:搜寻专家 更新时间:2023-10-31 01:42:35 25 4
gpt4 key购买 nike

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

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

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

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

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

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

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

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

最佳答案

我遇到过类似情况,这对我有用(使用 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 就足够了,其他库应该由动态链接器自动链接。

关于c++ - 具有依赖关系的共享库的动态链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26619897/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com