3

我想了解以下场景到底发生了什么。我有一个共享库(A),它通过动态加载加载另一个共享库(B)。库 A 也公开了一些方法(F1)。

主程序加载库 A,然后库 A 稍后加载库 B。现在,当库 B 尝试使用库 A 中的函数 F1 时,它无法加载其符号,并且编译会静默停止执行,而不会给出任何警告/错误或核心。即使我可以看到从库 A 中导出的这些符号(使用 nm 命令)。我不太确定到底发生了什么。我在 Linux.64 上观察到了这一点。Windows 上的相同场景工作。

4

1 回答 1

0

我的心理调试能力告诉我,因为您将其标记为 C++,所以您正在编译 C++ 代码。我还猜想您使用稍微不同的选项来编译库 A 和 B,导致它们的名称装饰和/或 ABI 不兼容,因此找不到方法。

您是否考虑过让链接器将所有共享对象应用到您的应用程序而不是使用dlopen? 然后您会立即知道存在问题,因为链接器无法匹配符号。

或者,Linux 可能只是不喜欢你的循环库引用:你能重构你的库以消除循环依赖吗?

于 2012-05-02T16:12:05.783 回答