未解析的typeinfo和dynamic_cast外部

时间:2017-10-25 21:27:57

标签: c++ inheritance clang++ unresolved-external

我遇到的问题与此处讨论的问题非常类似: g++ undefined reference to typeinfo

即便如此,我相信我也没有同样的问题,而且这个topi的答案并没有真正帮助我。 我拥有的是:

class Base
{
    virtual ~Base() {}
    virtual void foo() = 0;
    // some other pure virtual behaviors
};

class Derived : public Base
{
    void foo() {/* do stuff */}
    // override for all other virtual behaviors
};

然后我有不同的功能:

void bar( Base * base )
{
    Derived * derived = dynamic_cast<Derived *>(base);
}

void foobar( const Base & base1, const Base & base2 )
{
    if ( typeid(base1) == typeid(base2) )
        /* do something */;
}

所以我确定该函数是纯虚拟的还是已定义的(即使该对象永远不能是Base)。这不应该给出任何问题,它与引用的不同 因为我确定我会覆盖虚函数。 即便如此,当使用clang ++进行编译时,在Derived上使用时,它会为typeid和dynamic_cast发出一个未解析的外部,而对于从Base继承的其他类,它不会这样做,并覆盖相同的foo行为。 为什么会这样做?

这里的错误:

error LNK2019: unresolved external symbol __imp___RTDynamicCast
error LNK2019: unresolved external symbol __imp___RTtypeid

我只是错过了一些愚蠢的事情,或者误解了这些错误?

修改

我意识到我第一次给出的代码示例不够具有描述性:

class Base
{
public:
    virtual ~Base() {}
};

class Interface : public Base
{
public:
    virtual void foo() = 0;
    // some other pure virtual behaviors
};

class Derived : public Interface
{
public:
    void foo() {/* do stuff */}
    // override for all other virtual behaviors
};

void bar()
{
    Base * base = new Derived;
    Interface * interface = dynamic_cast<Interface *>(base);
    interface->foo()
}

更适合我想要做的事情。

2 个答案:

答案 0 :(得分:0)

在代码编译器中使用dynamic_cast<Derived *>(base);时,内部生成call [__imp___RTDynamicCast]指令(这不是x86平台,x86将调用[__imp____RTDynamicCast])。当您使用typeid(base1) == typeid(base2)编译器生成call [__imp___RTtypeid]时(在x86平台上将为call [__imp____RTtypeid])。当你开始链接 - 链接器视图,在代码中使用2个符号:__imp___RTDynamicCast__imp___RTtypeid - 他在所有obj和lib文件中搜索它,你传递给他作为输入,但无法找到。结果并给你错误LNK2019: unresolved external symbol

你需要搜索你的crt lib文件 - 它包含这个字符串 - __imp____RTtypeid__imp___RTDynamicCast - 因为存在很多不同的crt版本 - 不可能的是,哪个lib将包含这个符号。说这可以是msvcurt[d].libvcruntime[d].lib。可能在msvcrt.lib。所有你需要的东西 - 将这个库中的一个添加到链接器输入。他找到了这个符号

答案 1 :(得分:0)

我在Visual Studio和CodeBlocks上使用Clang 5.0 Platform Toolset LLVM-VS2014时遇到此问题。

我添加了msvcrt.lib以提供缺少的__imp ____ RTDynamicCast。

如何推断这一点,我还没有理解: - (