包含 Boost C++ 标头会导致 dlopen() 返回错误:_ZTVN10__cxxabiv117__class_type_infoE
Posted
技术标签:
【中文标题】包含 Boost C++ 标头会导致 dlopen() 返回错误:_ZTVN10__cxxabiv117__class_type_infoE【英文标题】:Including a Boost C++ header causes dlopen() to return error: _ZTVN10__cxxabiv117__class_type_infoE 【发布时间】:2021-10-24 02:46:56 【问题描述】:C HelloWorld.so(共享对象)是通过在 C++ myatomic 库中的链接创建的。该 C++ 库使用 Boost Header:
myatomic.cpp
...
#include <boost/system/error_code.hpp>
...
使用 dlopen() 加载 HelloWorld.so 返回错误:_ZTVN10__cxxabiv117__class_type_infoE
如果该 Boost 标头被注释掉,那么 dlopen() 会成功吗?
HelloWorld.yaml
...
Common:
Sources:
- Folder: src
Files:
- HelloWorld.h
- HelloWorld.c
ConanLibs:
- CONAN_PKG::myatomic
Linux:
CompilerOptions:
- -fPIC
LinkerOptions:
- -lstdc++
linux下的Boost C++是否需要用特定的选项来构建?也许 gcc 与 g++ 的问题? 将 -lstdc++ 添加到 HelloWorld 链接器选项,但无济于事。 :(
【问题讨论】:
您将 4 个随机库链接到 HelloWorld.so,但没有 boost.system。所有那些-Wno
也不应该在那里。不,您通常不能从 C 中使用 boost 和 C++ 接口。
【参考方案1】:
一位同事发现了此修复程序
如果我们与 C++ 材料(在本例中为 Boost C++)交互,我们 需要使用 g++。 gcc 工具,即使提供了一堆 -lstdc++ args - 就“链接器/加载器提示”之类的东西而言,不能满足 g++ 编译器的要求
错误 _ZTVN10__cxxabiv117__class_type_infoE 的原因是 HelloWorld.so(C 程序)没有加载依赖于运行时的(C++ 共享对象)libstdc++.so.6。例如,
$ ldd HelloWorldBAD.so
linux-vdso.so.1 (0x00007ffc8a5c5000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f78cf21f000)
/lib64/ld-linux-x86-64.so.2 (0x00007f78cf431000)
$ ldd HelloWorldGOOD.so
linux-vdso.so.1 (0x00007ffd53bba000)
libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f2540003000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f253fe11000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f253fcc2000)
/lib64/ld-linux-x86-64.so.2 (0x00007f2540205000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f253fca7000)
编辑
还发现ordering of the -lstdc++ option很重要。 (另见link) 此命令通过将 -lstdc++ 选项放在构建命令的 END 处正确包含 C++ 运行时依赖项
/usr/bin/cc -fPIC -O2 -g -DNDEBUG -shared -Wl,-soname,HelloWorld.so ...Lots of Boost Libraries... -lstdc++
而将选项放在 Boost 库之前不会
/usr/bin/cc -fPIC -O2 -g -DNDEBUG -lstdc++ -shared -Wl,-soname,HelloWorld.so ...Lots of Boost Libraries...
【讨论】:
以上是关于包含 Boost C++ 标头会导致 dlopen() 返回错误:_ZTVN10__cxxabiv117__class_type_infoE的主要内容,如果未能解决你的问题,请参考以下文章
Ubuntu 命令行:运行 ./configure 导致错误“找不到 Boost 标头”
C++ 包括 python.h 和 boost/python.hpp 导致 SEH 异常
在 Delphi 7 中使用 C++ Boost 图形库 (BGL)
为啥 boost shared_ptr 包含带有 close() 的标头?