Qt vs2010 编译问题"/>
Qt vs2010 编译问题
2014.9.27 今天发现vs2010下qt程序编译无法通过的问题是因为项目路径中有中文,重新建立一个项目,目录中全部为英文,发现可以通过编译
使用VS2010开发qt4程序,在编译过程中遇到如下问题
Link:
1> LINK : 没有找到 G:\cpp\测试代码\stl\qttest3\Win32\Debug\\qttest3.exe 或上一个增量链接没有生成它;正在执行完全链接
1>main.obj : error LNK2001: 无法解析的外部符号 "public: virtual struct QMetaObject const * __thiscall FindDialog::metaObject(void)const " (?metaObject@FindDialog@@UBEPBUQMetaObject@@XZ)
1>main.obj : error LNK2001: 无法解析的外部符号 "public: virtual void * __thiscall FindDialog::qt_metacast(char const *)" (?qt_metacast@FindDialog@@UAEPAXPBD@Z)
1>main.obj : error LNK2001: 无法解析的外部符号 "public: virtual int __thiscall FindDialog::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@FindDialog@@UAEHW4Call@QMetaObject@@HPAPAX@Z)
1>G:\cpp\测试代码\stl\qttest3\Win32\Debug\\qttest3.exe : fatal error LNK1120: 3 个无法解析的外部命令
1>
1>生成失败。
源代码:
//main.cpp
#include <QtGui/QApplication>
#include <QMainWindow>
#include <QLabel>
#include <QtGui>
#include <QDialog>
#include <QPushButton>
class FindDialog : public QDialog
{
Q_OBJECT
public:
FindDialog(QWidget *parent = 0);
private slots:
void findClicked();
void slfindNext();
signals:
void findNext();
private:
QPushButton *pushbt;
};
FindDialog::FindDialog(QWidget *parent)
: QDialog(parent)
{
pushbt=new QPushButton("push",this);
connect(pushbt, SIGNAL(clicked()),
this, SLOT(findClicked()));
connect(this, SIGNAL(findNext()),
this, SLOT(slfindNext()));
}
void FindDialog::findClicked()
{
emit findNext();
}
void FindDialog::slfindNext(){
int t;
for(t=0;t<5;t++)
;
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
FindDialog *finddialog =new FindDialog();
finddialog->show();
return a.exec();
}
#include "main.moc"
解决办法:在main.cpp底部添加一行代码 :
#include "main.moc"
main.moc的位置在GeneratedFiles\Debug目录下
问题解决.造成这个问题的原因暂借没有分析,先转载其他文章共借鉴:
首先这个故事发生的环境是 QT+VS2008
然后是引用别人的文章
/%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) (char const *)" (?qt_metacast@MainWindowBottomWidget@@UAEPAXPBD@Z) QMetaObject::Call,int,void * *)" (?qt_metacall@MainWindowBottomWidget@@UAEHW4Call@QMetaObject@@HPAPAX@Z) 问题原因:没有找到根本原因,据说是链接时无法找到对应的moc文件。
如果用到信号槽但类的定义没有放在.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.移除[注意不是删除]ui文件,然后再添加进来,重新编译++++++
2.注意自定义的connect里面的slot函数的定义是否被删除掉了
更多推荐
Qt vs2010 编译问题
发布评论