未解析的外部类型信息和dynamic_cast

问题描述 投票:0回答:3

我遇到的问题与这里讨论的问题非常相似: g++ 对 typeinfo 的未定义引用

即便如此,我相信我没有遇到同样的问题,并且该主题的答案并不能真正帮助我。 我拥有的是:

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()
}

更适合我想做的事情。

c++ inheritance clang++ unresolved-external
3个回答
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].lib
vcruntime[d].lib
。可能在
msvcrt.lib
。所有您需要的东西 - 将这个库之一添加到链接器输入。他找到了这个符号


0
投票

我在 Visual studio 和 CodeBlocks 上使用 Clang 5.0 平台工具集 LLVM-VS2014 时遇到了这个问题。

我添加了 msvcrt.lib 以提供缺少的 __imp____RTDynamicCast。

如何推断这一点,我还没明白:-(


0
投票

我也遇到了类似的问题,原来我只是没有在cmake依赖列表中指定动态库(

© www.soinside.com 2019 - 2024. All rights reserved.