【发布时间】:2019-02-25 12:52:30
【问题描述】:
我正在做一个非常大的项目。我的项目包含很多共享库。一些源文件 (CPP) 用于多个共享库中。
最近我遇到了一个错误,需要在执行时找出函数的 .so 名称。
例如:
Test1.cpp 包含函数 TestMethod()
Test1.cpp 包含在 lib1、lib2 和 lib5 中。大约有 10 个图书馆。
所以 TestMethod 存在于 lib1、lib2 和 lib5 中。
- 我想从 TestMethod() 内部调用一个函数,这样当程序正在执行时,当调用 TestMethod() 时,它应该返回它是 lib1 的版本还是 lib2 的版本或 lib5 的版本。
TestMethod() 正在创建一个 SubType 对象,它是 SuperType 的子类。 SubType 和 SuperType 在 Test1.cpp 中定义。有时 lib6/lib7 正在调用 TestMethod 并获取对象。完成后,lib6/lib7 正在对象指针上调用 delete。但是删除因分段错误而崩溃,回溯顶部显示“typeinfo for class SubType”。
[注 1]:我使用的是 libc++ 库。 RTTI 不能跨共享库工作。所以我怀疑这是导致问题的原因。我怀疑当 delete 被调用时,它(lib6 中的 delete 调用)似乎试图获取 SubType 的类型信息并且未能获取它。
通过获得使用什么库的信息,我可以调试编译,链接用于准备共享库的标志。
任何建议都将不胜感激。谢谢
【问题讨论】:
-
这应该取决于您实际链接的库,以及如何链接(库是静态库还是动态库?)
-
都是动态库
-
您的应用程序是否链接到所有库?而且,只要它做同样的事情,使用哪个定义真的很重要吗?您遇到的真正问题是什么?请直接询问(除非这只是出于好奇,在这种情况下,您应该通过编辑您的问题明确说明)。
-
是的。我的应用程序正在使用所有库。 +添加了更多细节。
-
这是
TestMethod函数本身的错误吗?还是在它调用的某些支持功能中?您可以在调试构建中复制错误并在调试器中运行/单步执行吗?除非您在不同的库中有不同版本的函数,否则我仍然不明白如果该函数中有错误有什么关系。修复一次函数,重建所有库,处处修复。
标签: c++ shared-libraries