我遇到的问题与此处讨论的问题非常类似: 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()
}
更适合我想要做的事情。
答案 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].lib
或vcruntime[d].lib
。可能在msvcrt.lib
。所有你需要的东西 - 将这个库中的一个添加到链接器输入。他找到了这个符号
答案 1 :(得分:0)
我在Visual Studio和CodeBlocks上使用Clang 5.0 Platform Toolset LLVM-VS2014时遇到此问题。
我添加了msvcrt.lib以提供缺少的__imp ____ RTDynamicCast。
如何推断这一点,我还没有理解: - (