我无法链接到定义需要使用的一组类的动态库。我的编译代码试图链接到类的typeinfo结构,但它不是由库导出的。但是,类的虚拟表是。
使用nm,我找到了我试图解析的符号:
U __ZTIN3net14QuicSpdyStreamE
这个类的动态库中唯一的特殊符号是:
S __ZTVN3net14QuicSpdyStreamE
我有两个问题:
背景
我试图链接到libnet.dylib,我通过一个铬组件构建它。感兴趣的类是QuicSpdyStream。它的所有虚拟函数都是在stream.cc中定义的。QuicSpdyStream本身是从具有单一纯虚函数OnDataAvailable()的QuicStream派生出来的。
我的测试程序如下所示:
#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;
}当我试图建造:
$ 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)。
发布于 2018-03-23 19:34:28
要解决这个问题,您必须编译代码,就像使用:-fno-rtti禁用RTTI的Chromium一样。
架构x86_64的未定义符号:“net的typeinfo::QuicSpdyStream”,引用于:
意味着为类MyStream生成的编译器所生成的运行时类型信息(RTTI)引用其基类net::QuicSpdyStream的缺失类型信息。这是因为铬是在默认情况下禁用RTTI [1]构建的。
..。默认情况下,铬的生成不需要RTTI,但是已知一些消毒剂需要它,比如CFI诊断和UBsan变体。
如果您愿意,也可以在铬配置中启用它(configure与rtti或no_rtti)。
GOOGLE_PROTOBUF_NO_RTTI[2][3.][4.].需要RTTI,但原生质有一个定义,允许在不使用RTTI的情况下使用它
https://stackoverflow.com/questions/49455040
复制相似问题