首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"typeinfo“符号未从动态库导出

"typeinfo“符号未从动态库导出
EN

Stack Overflow用户
提问于 2018-03-23 17:07:40
回答 1查看 779关注 0票数 2

我无法链接到定义需要使用的一组类的动态库。我的编译代码试图链接到类的typeinfo结构,但它不是由库导出的。但是,类的虚拟表是。

使用nm,我找到了我试图解析的符号:

U __ZTIN3net14QuicSpdyStreamE

这个类的动态库中唯一的特殊符号是:

S __ZTVN3net14QuicSpdyStreamE

我有两个问题:

  • 为什么我的代码要寻找这个符号?
  • 我能建这个图书馆让它发出这个符号吗?

背景

我试图链接到libnet.dylib,我通过一个铬组件构建它。感兴趣的类是QuicSpdyStream。它的所有虚拟函数都是在stream.cc中定义的。QuicSpdyStream本身是从具有单一纯虚函数OnDataAvailable()QuicStream派生出来的。

我的测试程序如下所示:

代码语言:javascript
复制
#include <iostream>

#include "base/macros.h"
#include "net/quic/core/quic_spdy_stream.h"
#include "net/quic/core/quic_types.h"

using namespace std;

class MyStream : public net::QuicSpdyStream {
 public:
  MyStream(net::QuicStreamId id, net::QuicSpdySession* session)
      : net::QuicSpdyStream(id, session){};

  void OnDataAvailable() override {};

 private:
  DISALLOW_COPY_AND_ASSIGN(MyStream);
};

int main(int argc, char** argv) {
  auto stream = new MyStream(net::QuicStreamId(1), NULL);
  cout << "Created stream with id:" << stream->id() << endl;
  return 0;
}

当我试图建造:

代码语言:javascript
复制
$ clang++ -I../externals/quic/src -I../externals/quic
-L../externals/libs -lnet -std=c++1y test.cpp 
Undefined symbols for architecture x86_64:   "typeinfo for net::QuicSpdyStream", referenced from:
typeinfo for net::MyStream in test-b130b2.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)

铬本身附带了一个玩具quic_server,它以这里这里的方式使用这个类。当我构建组件时,关联的quic_server不依赖于typeinfo结构符号--这让我觉得我并不需要它。

我想知道这是否是一个ABI问题,因为Chromium是在我的Mac上构建的,clang版本为7.0.0,而我的系统版本是LLVM版本9.0.0 (clang-900.0.39.2)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-23 19:34:28

要解决这个问题,您必须编译代码,就像使用:-fno-rtti禁用RTTI的Chromium一样。

架构x86_64的未定义符号:“net的typeinfo::QuicSpdyStream”,引用于:

意味着为类MyStream生成的编译器所生成的运行时类型信息(RTTI)引用其基类net::QuicSpdyStream的缺失类型信息。这是因为铬是在默认情况下禁用RTTI [1]构建的。

..。默认情况下,铬的生成不需要RTTI,但是已知一些消毒剂需要它,比如CFI诊断和UBsan变体。

如果您愿意,也可以在铬配置中启用它(configurerttino_rtti)。

GOOGLE_PROTOBUF_NO_RTTI[2][3.][4.].需要RTTI,但原生质有一个定义,允许在不使用RTTI的情况下使用它

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49455040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档