error LNK2001: 无法解析的外部符号 Qt的moc机制

转载 2017年09月16日 16:27:54

先转一下其他人的帖,同样是error LNK2001的问题。

第一次来发个帖,如果可能的话期望找到根本原因!

几天没有关注我的QT程序,再次拿出来编译后竟然出现连接错误,因为四体不勤,没有频繁的checkin,所以无法找到中间版本,只能解决问题了。

1>MainWindowBottomWidget.obj : error LNK2001: 无法解析的外部符号 "public: virtual struct QMetaObject const * __thiscall

MainWindowBottomWidget::metaObject(void)const " ()
1>MainWindowBottomWidget.obj : error LNK2001: 无法解析的外部符号 "public: virtual void * __thiscall MainWindowBottomWidget::qt_metacast

(char const *)" ()
1>MainWindowBottomWidget.obj : error LNK2001: 无法解析的外部符号 "public: virtual int __thiscall MainWindowBottomWidget::qt_metacall(enum

QMetaObject::Call,int,void * *)" ()

问题原因:没有找到根本原因,据说是链接时无法找到对应的moc文件。
VS2008问题解决方法:在对应的cpp文件的末尾加上#include "moc_MainWindowBottomWidget.cpp"(文件名根据实际情况修改)


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

如果用到信号槽但类的定义没有放在.h文件中, qmake不会自动调moc, 你就需要写#include "moc_MainWindowBottomWidget.cpp"告诉qmake你有文件需要

moc

在visual studio中,如果是接下来添加的Q_OBJECT宏、信号函数、槽函数等,由于之前编译过程中没有生成moc文件,或者该moc文件已被删除,那么新添加

后,visual studio就不会再生成moc文件了,这就导致visual studio在链接时出现以上情况的Error。

我总结的原因如下:

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的错误。

修改方法:

如果在.cpp文件的末尾添加#include "moc_MainWindowBottomWidget.cpp",确实可以解决error LNK2001的问题。但是,总有一种让人很不爽的感觉。我用以下的方法解决了这个问题:
1. 复制一份.h、.cpp文件并备份起来;
2. 在vs工区中移除并删除对应文件;
3. 新建两个空白文件,命名为*.h、*.cpp,再重新加载这两个文件至工程中;
4. 将备份中的.h、.cpp文件中的内容复制到新添加的*.h、*.cpp文件里;
5. 重新编译。


 

我没有解决,但是把pro文件重新导进去,没有问题了

lnk2001 无法解析的外部符号 的几种情况及解决办法

Error LNK2001 无法解析的外部符号 的几种情况及解决办法 .  今天写了一个小程序,然后碰到了“Error LNK2001 无法解析的外部符号”这个问题,一直解决不了,后来上网搜了下,发...
  • bendangth
  • bendangth
  • 2015年08月14日 22:14
  • 5302

解决OpenSSL 在VC2015下链接报错的问题。

起因: 公司项目 服务器的nginx是使用的定制版,使用了concat、缩略图生成等模块,为了方便同事们在办公室环境下使用nginx,在Windows下编译nginx,并带上这两个模块。之前在 VC2...
  • bywayboy
  • bywayboy
  • 2015年10月07日 11:05
  • 7981

vs2010+win7(64)无法链接glew的解决办法

最近接触glew,但是,下了几个文件都没有办法链接,老是出现下面的错误
  • vanlin5566
  • vanlin5566
  • 2015年01月04日 04:39
  • 7513

VS2015下解决:无法解析的外部符号 __imp___vsnprintf 及__iob_func

VS2015下解决:无法解析的外部符号 __imp___vsnprintf 及__iob_func
  • hebbely
  • hebbely
  • 2016年12月21日 09:40
  • 9695

matlab文件编译成库在C++环境下使用遇到的问题记录

本文是老师给的一个graphmatching的项目,里面包含四个.m文件,对应四个函数,需要编译生成库文件在C++环境下调用 下面这个链接对成功实现此过程有很大帮助[http://m.blog.csd...
  • na_beginning
  • na_beginning
  • 2015年07月22日 11:01
  • 1393

关于:无法解析的外部符号 _libiconv报错的解决方法

6>Tools.obj : error LNK2001: 无法解析的外部符号 _libiconv_close 6>Tools.obj : error LNK2001: 无法解析的外部符号 _libi...
  • u013174689
  • u013174689
  • 2014年07月27日 23:22
  • 1941

c++连接mysql并提示“无法解析的外部符号 _mysql_server_init@12”解决方法

今天要用c++连接mysql server,便在网上查了下,但是中途也出了点小问题,但是接着查便解决了,怕以后忘记,便写下来,也希望这篇文章对大家有所帮助。        我用的是vs2012, my...
  • w20175357
  • w20175357
  • 2014年12月25日 20:36
  • 2821

Win8下编译openssl成功 最后一步链接出问题的解决办法

nmake过程中,一断的缺少 .h .lib 等文件,不知道如何设置路径 直接复制
  • u014598410
  • u014598410
  • 2014年04月11日 16:37
  • 2622

VS2008下X264(svn 2009.0216)编译不过的解决办法(附编译通过+修改内存泄露版本)

原文地址:http://bbs.chinavideo.org/viewthread.php?tid=6945&highlight=VS2008  总有人说最新的版本编译不过,搞的群、论坛里到处都是这...
  • HEVC_CJL
  • HEVC_CJL
  • 2013年01月16日 12:45
  • 1792

CUDA问题总结1

问题一:无法解析的外部符号 ___cudaUnregisterFatBinary@4 描述: 1>CUDAdll.cu.obj : error LNK2019:无法解析的外部符号 ___c...
  • fengzizhuang
  • fengzizhuang
  • 2014年03月06日 02:47
  • 1628
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:error LNK2001: 无法解析的外部符号 Qt的moc机制
举报原因:
原因补充:

(最多只允许输入30个字)