我想了解以下情况,确切地说是什么。 我有一个共享库(A),它通过动态加载加载另一个共享库(B)。 库A也暴露了一些方法(F1)。
主程序加载库,A然后库A在稍后加载库B. 现在当库B尝试使用库A中的函数F1时,它无法加载其符号,并且编译会静默停止执行而不会给出任何警告/错误或核心。即使我可以看到从库A导出的这些符号(使用nm命令)。 我不太确定到底发生了什么。我在Linux.6上观察到了这一点。 Windows上的相同场景工作。
答案 0 :(得分:0)
我的通灵调试能力告诉我,因为你将它标记为C ++,你正在编译C ++代码。我还猜你用了稍微不同的选项来编译库A和B,导致它们的名称修饰和/或ABI不兼容,因此无法找到方法。
您是否考虑让链接器将所有共享对象应用于您的应用程序而不是使用dlopen
?然后你就会立即知道存在问题,因为链接器无法与符号匹配。
或许Linux可能不喜欢你的循环库引用:你能重构你的库以消除循环依赖吗?