我遇到的问题与这里讨论的问题非常相似: 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]
)。当您开始链接时 - 链接器视图在代码中使用了 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
。所有您需要的东西 - 将这个库之一添加到链接器输入。他找到了这个符号
我在 Visual studio 和 CodeBlocks 上使用 Clang 5.0 平台工具集 LLVM-VS2014 时遇到了这个问题。
我添加了 msvcrt.lib 以提供缺少的 __imp____RTDynamicCast。
如何推断这一点,我还没明白:-(
我也遇到了类似的问题,原来我只是没有在cmake依赖列表中指定动态库(