引入Boost C++头文件导致dlopen()返回_ZTVN10__cxxabiv117__class_type_infoE错误
_ZTVN10__cxxabiv117__class_type_infoE是C++ ABI中类类型信息的虚表符号,该缺失问题和Boost编译选项无关,是编译链适配与链接依赖不全导致的,具体说明如下:
核心原因
- 编译/链接工具链不匹配
你的HelloWorld.so核心源文件是C语言实现,默认会调用gcc作为编译器/链接器;而依赖的myatomic是C实现的库,使用g编译。gcc链接C生成的产物时,默认不会引入完整的C++运行时依赖,你仅添加-lstdc++仅覆盖了标准库部分,缺少了RTTI、异常处理相关的libsupc++依赖,就会出现该符号缺失。 - Boost头文件引入额外依赖
boost/system/error_code.hpp内部实现用到了C类继承、RTTI特性,编译myatomic时会生成对上述cxxabi符号的依赖;注释该头文件后myatomic不再用到相关C特性,没有对应符号依赖,因此dlopen可以正常执行。
修复方案
- 优先将HelloWorld.so的链接器从gcc替换为g++,g会自动补齐所有需要的C运行时依赖,无需手动配置
-lstdc++等选项,兼容性最高 - 如果必须使用gcc作为链接器,在现有链接选项基础上追加
-lsupc++,补齐RTTI相关的运行时库依赖 - 额外校验Conan源中的myatomic库编译使用的gcc版本,和当前HelloWorld的编译gcc版本保持大版本一致,跨大版本gcc编译的C++库混合链接也会触发符号缺失问题
内容的提问来源于stack exchange,提问作者vengy
相关产品推荐
相关产品推荐

