typeinfo和dynamic_cast外部未解析

unresolved external to typeinfo and dynamic_cast

本文关键字:外部 cast dynamic typeinfo      更新时间:2023-10-16

我遇到的问题与这里讨论的问题非常相似: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()
}

更适合我的工作。

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

你需要搜索你的crt库文件-它正包含这个字符串-__imp____RTtypeid__imp___RTDynamicCast-因为存在很多不同的crt版本-不可能说,哪个库将包含这个符号。比如这可以是CCD_ 12或CCD_。可以在CCD_ 14中。您所需要的一切-将其中一个libs添加到链接器输入中。他发现这个符号

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

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

人们应该如何推断这一点,我还不明白:-(