QT + VS2005 编译出现 error LNK2001: 无法解析的外部符号 "public: virtual struct QMetaObject const * __thiscall Widget::metaObject 错误

在使用QT + VS2005编译程序时,有时出现如下错误:
错误 1 error LNK2001: 无法解析的外部符号 "public: virtual struct QMetaObject const * __thiscall Widget::metaObject(void)const " (?metaObject@Widget@@UBEPBUQMetaObject@@XZ)
错误 2 error LNK2001: 无法解析的外部符号 "public: virtual void * __thiscall Widget::qt_metacast(char const *)" (?qt_metacast@Widget@@UAEPAXPBD@Z)
错误 3 error LNK2001: 无法解析的外部符号 "public: virtual int __thiscall Widget::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@Widget@@UAEHW4Call@QMetaObject@@HPAPAX@Z)
错误 4 fatal error LNK1120: 3 个无法解析的外部命令

查找原因:
1. 是否加上了Q_OBJECT宏?
2. 你的widget里用到signal slot了吧?(也许是后续加的)
3. 类定义在cpp里了? 没有相应的.h文件?
4. 如果以前没信号槽新加的, 那么makefile需要重新生成。

总结的原因如下:
vs在编译时会产生一系列的命令以控制该.h、.cpp文件的编译过程,并且,以后不会自动修改这些命令。
利用Qt编程时,写好.h、.cpp文件并第一次编译之后,若.h文件中定义类时没有添加Q_OBJECT宏以及信号函数、槽函数,VS编译命令中就没有moc命令,就不会调用Qt的moc工具以生成moc_*.cpp文件;并且即使添加了Q_OBJECT宏之后,VS也不会自动添加moc命令,因而不会生成moc文件。
VS在LINK时,找不到moc文件,就出现了error LNK2001的错误。

解决方法:假设代码文件分别为hello.h、hello.cpp、ui_hello.h。需要编译生成并添加上moc_hello.cpp文件。
  右击hello.h,选择“自定义生成步骤”,“常规”
  命令行:moc.exe hello.h -o moc_hello.cpp
  输出:moc_hello.cpp
  附加依赖项:moc.exe hello.h
  确定,然后,右击hello.h,选择 “编译”,则在文件夹中生成moc_hello.cpp,再将其添加到源文件中。
然后运行程序,如果出现错误:
  错误 fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "stdafx.h"”?
  则在moc_hello.cpp文件的开头添加上:#include "stdafx.h"。
然后,再运行。仍然出现上面错误。这是因为当运行程序,又重新生成了moc_hello.cpp文件(这个新的文件的开头显然是没有#include "stdafx.h"),覆盖了已经修改过的文件。
  解决方法:右击hello.h,选择“自定义生成步骤”,“常规”
  清空“命令行” “输出” “附加依赖项” 里对应的内容。这样在运行程序时就不会再生成新的moc_hello.cpp文件了。然后确定。
  这样再次运行程序,可以成功运行。

对于上述的第二个错误可以直接在项目属性--》C/C++--》预编译头--》创建/使用预编译头改为不使用预编译头。就可以一劳永逸了,不用上述这么麻烦的方法了。

原文地址:https://www.cnblogs.com/liuyunfeifei/p/3052856.html