gpt4 book ai didi

c++ - 不从动态库导出的“typeinfo”符号

转载 作者:行者123 更新时间:2023-12-01 14:55:09 25 4
gpt4 key购买 nike

我无法链接到动态库,该库定义了我需要使用的一组类。我的编译后的代码尝试链接到该类的typeinfo结构,但库未将其导出。但是,该类的虚拟表是。

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

U __ZTIN3net14QuicSpdyStreamE



在动态库中此类的唯一特殊符号是:

S __ZTVN3net14QuicSpdyStreamE



我有两个问题:
  • 为什么我的代码正在寻找这个符号?
  • 我可以构建该库以使其发出此符号吗

  • 背景

    我正在尝试链接到通过Chromium的组件版本构建的libnet.dylib。感兴趣的类别是 QuicSpdyStream。它的所有虚拟功能都在 quic_spdy_stream.cc中定义。 QuicSpdyStream本身是从 QuicStream派生的,它具有一个纯虚拟函数 OnDataAvailable()

    我的测试程序如下所示:

    #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)

    Chromium本身附带了玩具quic_server,该玩具quic_server类似于 herehere来使用此类。当我构建组件构建时,关联的quic_server不依赖于typeinfo结构符号-这使我认为我真的不需要它。

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

    最佳答案

    若要解决此问题,您必须像使用禁用RTTI的Chromium一样编译您的代码,方法是:-fno-rtti

    Undefined symbols for architecture x86_64: "typeinfo for net::QuicSpdyStream", referenced from: typeinfo for net::MyStream



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

    ... Chromium builds without RTTI by default, but some sanitizers are known to require it, like CFI diagnostics and UBsan variants.



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

    protobuf需要RTTI,但有一个定义,允许在没有它的情况下使用它 GOOGLE_PROTOBUF_NO_RTTI [ 2] [ 3] [ 4]。

    关于c++ - 不从动态库导出的“typeinfo”符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49455040/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com