包含 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() 的标头?

Boost.Exception 符号出现在“nm”输出中是啥意思?它们会导致 ODR 违规吗?

Boost:仅安装标头