QT4 error LNK2001: 无法解析的外部符号

转自:http://blog.csdn.net/bloodkain/article/details/7614224


首先这个故事发生的环境是  QT+VS2008

然后是引用别人的文章

http://hi.baidu.com/%BC%BC%CA%F5%B2%BB%CA%C7%B7%B9%CD%EB/blog/item/bb22fb25fc3c552bc9955923.html

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

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

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

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

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

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

QMetaObject::Call,int,void * *)" (?qt_metacall@MainWindowBottomWidget@@UAEHW4Call@QMetaObject@@HPAPAX@Z)

问题原因:没有找到根本原因,据说是链接时无法找到对应的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. 重新编译。

然后我的措施:

1.移除[注意不是删除]ui文件,然后再添加进来,重新编译++++++

2.注意自定义的connect里面的slot函数的定义是否被删除掉了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值