typeinfo和dynamic_cast外部未解析
unresolved external to typeinfo and dynamic_cast
我遇到的问题与这里讨论的问题非常相似: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。
人们应该如何推断这一点,我还不明白:-(
- 如何理解C++标准N3337中的expr.const.cast子句8
- C++Cast运算符过载
- 在函数内部的声明中初始化数组,并在外部使用它
- 使外部项目可用于find_package CMake
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- 使用外部SDK工具链文件在VisualStudio上生成项目编译错误
- C++:来自外部文件的Trivia
- 从函数角度看ID到文件路径的内部与外部映射
- C++:将外部库链接到dll库
- spdlog标头仅与外部fmt一起使用.spdlog错误:'内部':不是'fmt'
- 节俭并发:未解决的外部问题
- 如何在c++中从git建立外部库
- 未解析的外部符号_MsiLocateComponentW@12.
- 如何使用对C函数和类对象的外部调用来处理C++头文件
- 具有外部"c"和程序集的未定义函数
- 为什么导入Mixed native/CLR lib.dll的本机C++应用程序没有在Mixed lib.dll中的外部变
- 在C++中使用 gRPC 时未解析的外部符号
- 在类函数中初始化外部作用域变量
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 调用外部函数,无法指定类型 C++/MVS