提问人:Massimo Castrioto 提问时间:10/26/2017 最后编辑:Massimo Castrioto 更新时间:12/9/2017 访问量:1230
无法解析 typeinfo 和 dynamic_cast 外部
unresolved external to typeinfo and dynamic_cast
问:
我遇到的问题与这里讨论的问题非常相似:g++ 对 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()
}
更适合我想做的事情。
答:
当你在代码中使用编译器内部生成指令时(这个不是针对 x86 平台,针对 x86 会调用)。当您使用编译器生成时(在 x86 平台上将是 )。当您开始链接时 - 链接器视图,在代码中使用了 2 个符号: 并且 - 他在您作为输入传递给他的所有 obj 和 lib 文件中搜索它,但找不到。结果并给你错误dynamic_cast<Derived *>(base);
call [__imp___RTDynamicCast]
[__imp____RTDynamicCast]
typeid(base1) == typeid(base2)
call [__imp___RTtypeid]
call [__imp____RTtypeid]
__imp___RTDynamicCast
__imp___RTtypeid
LNK2019: unresolved external symbol
您需要搜索您的 CRT LIB 文件 - 它正好包含此字符串 - 并且 - 因为存在许多不同的 CRT 版本 - 不可能说哪个 lib 将包含此符号。说这可以是 或 .可能在 .您需要的所有内容 - 将此库之一添加到链接器输入。他找到了这个符号__imp____RTtypeid
__imp___RTDynamicCast
msvcurt[d].lib
vcruntime[d].lib
msvcrt.lib
评论
libvcruntime.lib
/NODEFAULTLIB:libvcruntime.lib
/NODEFAULTLIB
msvcurt.lib
vcruntime.lib
libvcruntime.lib
vcruntime.lib
msvcurt.lib
我在Visual Studio和CodeBlocks上使用Clang 5.0平台工具集LLVM-VS2014时遇到了这个问题。
我添加了msvcrt.lib以提供缺少的.__imp____RTDynamicCast
评论
我遇到了类似的问题,原来我只是没有在CMake依赖项列表中指定动态库。
评论
重写
。这样可以确保您不会错过函数原型中的一些细节。它看起来像这样:.void foo() override {...}
msvcurt.lib
typeid
__imp___RTtypeid
dynamic_cast
__imp___RTDynamicCast
msvcurt.lib
vcruntime.lib