VS编译出现无法解析的外部符号:qt_metacall metaObject(void) const qt_metacast

背景:将qt源码移植到自己项目里的过程中,出现了一大堆无法解析的外部符号以及一堆的link错误,接下来我会从各个方面一一分析每种错误产生的原因

Qt-moc简单介绍:Qt 不是使用“标准的”C++语言编写,而是对其进行了一定程度的扩展。我们可以从Qt增加的关键字看出来:signals、slots或emit。但是编译时,编译器并不认识这些非标准c++的关键字,那么就需要Qt自己将扩展的关键字处理成标准的C++代码。Qt在编译之前会分析源文件,当发现包含了 Q_OBJECT 宏,则会生成另外一个标准的C++源文件,这个源文件中包含了 Q_OBJECT 宏的实现代码,这个源文件名字是将原文件名前面加上 moc_ 构成,这个新的文件同样将进入编译系统,最终被链接到二进制代码中去,此时,Qt将自己增加的扩展转换成了标准的C++文件,moc 全称是 Meta-Object Compiler,也就是“元对象编译器”。这就是moc文件的由来。

错误一:提示无法解析的外部符号:qt_metacall metaObject(void) const qt_metacast

原因:VS在第一次编译后,之后就不会再调用MOC命令。有两种情况,情况一:添加了普通文件后,再自己对其添加Q_OBJECT宏,情况二:之后再添加的类中有信号与槽机制时(加Q_OBJECT),是不会调用MOC,将新的类转化为标准C++兼容形式,就会报错。

解决方法:可以将文件排除后重新添加,这个时候VS会自动去识别文件类型,另外一种方法是:

1.找到当前用的Qt版本,使用cmd的CD命令到到该Qt版本的moc.exe所在文件夹下面

2.按照下图格式将头文件转化为moc文件

 3.将生成的moc_XX.cpp文件放到GeneratedFiles\Debug的目录下。再在VS界面中添加moc文件。

VS编译出现无法解析的外部符号:qt_metacall metaObject(void) const qt_metacast_第1张图片

4.重新编译运行。

错误二Qt跳过某些CPP文件,不对其进行编译,在链接的时候出现无法解析的外部符号提示。

原因:在文件添加进VS中的时候,VS会首先对文件进行一次分析,如果文件中添加了Q_OBJECT宏定义,则VS就会认为该文件不是标准的C++文件,就会把对该文件的编译器自动改为自定义类型编译器,如下图所示:

VS编译出现无法解析的外部符号:qt_metacall metaObject(void) const qt_metacast_第2张图片

 VS编译出现无法解析的外部符号:qt_metacall metaObject(void) const qt_metacast_第3张图片

 该自定义编译器会对带有Q_OBJECT宏的文件进行编译,上文有提到,对于头文件会生成moc_XX的cpp文件,但如果在CPP文件中包含了Q_OBJECT宏,该编译器则会把该CPP文件编译成XX.moc类型的文件,导致编译的时候略过该CPP文件,最终导致前文所说的问题。

解决方法:尽量不在CPP文件中添加Q_OBJECT宏(当然肯定还有解决方法,以后找到了更新,还有,这个问题在QtCreater里面是不存在的,Qt有自己的一套解决方案)

后面的忘了,想到了继续更新。。。

VS在第一次编译后,之后就不会再调用MOC命令。也就是再添加的类中有信号与槽机制时(加Q_OBJECT),是不会调用MOC,将新的类转化为标准C++兼容形式,就会报错。

解决方法:

你可能感兴趣的:(qt,c++,visualstudio)