Qt经典出错信息

来源:百度文库 编辑:神马文学网 时间:2024/04/28 15:52:10
1.Qt经典出错信息之QApplication:No such file or directory
这个出错信息一般是新手在编译Qt4第一个应用"Hello,World"的时候,翻开Qt编程的第一个例子。都说很简单。#include #include int main(int argc, char *argv[]){QApplication app(argc,argv);QWidget *ww=new QWidget();ww->resize(300,200);ww->show();return app.exec();}main.c:1:25: error:QApplication: No such file or directory
main.c:2:19: error:QLabel: No such file or directory
main.c: In function ‘intmain(int, char**)’:
main.c:9: error: ‘QApplication’ was notdeclared in this scope
main.c:9: error: expected `;' before‘app’
main.c:10: error: ‘QLabel’ was not declared in thisscope
main.c:10: error: ‘label’ was not declared in thisscope
main.c:10: error: expected type-specifier before‘QLabel’
main.c:10: error: expected `;' before‘QLabel’
main.c:13: error: ‘app’ was not declared in thisscope
shell returned 1
Press ENTER or type command tocontinue
一编译结果出现了上面这个错误,那叫一个郁闷。
其实花点心思照着提示,新手也是可以自己解决问题的。根据提示QApplication提示,应该是头文件没找到。那我们可以查看当前目录下Makefile里的环境变量INCPATH知道make应用是去哪里找头文件的。例如
./Makefile 文件部分内容
15 CXXFLAGS     = -pipe -O2 -Wall -W -D_REENTRANT $(DEFINES)
16 INCPATH      = -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore-I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. -I.
17LINK          = g++
第16行里面的,对应的去查找/usr/include/qt4/QtGui/QApplication这个文件是否存在(一般是不存在,存在就不会出错了)。不存在QApplication文件的原因大致有两个
1)没有装Qt4的开发包.
解决办法把开发包装上,比如ubuntu下就是在shell里执行sudoinstall libqt4-dev;Fedora/SUSe下是在shell里执行sudoyum install qt4-devel
2) Qt4的开发包装了,但是调用了Qt3的qmake
因为有的系统里既装了Qt3,又装了Qt4。如果调用了qt3的qmake,那么上头的INCPATH里的头文件路径也指向了Qt3,那么是找不到QApplication这个文件的。对应的解决方法就是调用Qt4安装路径下的qmake去生成Makefile,最好用全路径或者重新设置环境变量:/usr/lib/qt4/bin:/usr/lib/qt-3.3/bin,将QT4写在前。我的机器Qt4中qmake安装路径是
zhu@ubuntu:~/test/widget$dpkg -L qt4-qmake |grep qmake |grepbin
/usr/bin/qmake-qt4
/usr/share/qt4/bin/qmake
所以只要执行
/usr/bin/qmake-qt4;make 或者/usr/share/qt4/bin/qmake:make
都能以Qt4的文件去编译这个最简单的Qt4应用。
Tags:Qt,出错信息,编译
Thisentry was posted on Saturday, June 6th, 2009 at 6:50 pm and is filedunderQt技术.You can follow any responses to this entry through theRSS2.0 feed. You canleavea response, ortrackbackfrom your own site.
如果执行以下命令:
qmake-project
qmake
make
仍有错误,可能是qmake版本问题,可以用这样的命令:
qmake-qt4 -project
qmake-qt4
make
即可解决,并生成与项目名匹配的可执行文件,之后执行方式如:./xxx(xxx为刚生成的可执行文件名)
2.Qt经典出错信息之undefinedreference to `vtable forclassname这个出错信息太常见了,用过Qt两个月以上的朋友基本上都能自己解决了,因为太经典了,可以给新手参考。
出错信息一般类似:undefinedreference to `vtable for classnameMyWidget`
在执行make命令后出现。
出错原因是在定义类的时候为了能使用signals和slot,在类定义的后面加了Q_OBJECT引起。因为Q_OBJECT是一个宏,在不同的类中展开是不同的代码,例如在mywidgeth.h中生成的
public:
templateinline void qt_check_for_QOBJECT_macro(const T &_q_argument)const {
int i = qYouForgotTheQ_OBJECT_Macro(this, &_q_argument);i = i;
}
static const QMetaObject staticMetaObject;
virtualconst QMetaObject *metaObject() const;
virtual void*qt_metacast(const char *);
static inline QString tr(const char*s, const char *c = 0) { return staticMetaObject.tr(s, c); }
staticinline QString trUtf8(const char *s, const char *c = 0) { returnstaticMetaObject.trUtf8(s, c); }
static inline QString tr(constchar *s, const char *c, int n) { return staticMetaObject.tr(s, c, n);}
static inline QString trUtf8(const char *s, const char *c, intn) { return staticMetaObject.trUtf8(s, c, n); }
virtual intqt_metacall(QMetaObject::Call, int, void **);private:
可以看到以上的代码声明了3个从父类继承的3个虚函数。本来这三个函数的实现应该是由moc_mywidget.cpp来完成。
而当前的错误正是因为Makefile里没有将moc_mywidget.cpp加入编译引起。
Makefile背后的原因是qmake,因为Qt的编译系统是通过qmake将.pro文件转换成Makefile文件。当qmake扫描.h代码时发现有Q_OBJECT这样字眼的代码时,会将一个用moc生成moc_xxx.cpp代码的依赖关系写到Makefile里。如果扫描时没有找到Q_OBJECT就不会生成额外的moc_xxx.cpp这样的文件。
出现最初一幕的原因是在执行qmake的时候.h代码里并没有O_OBJECT这样的代码。而执行make的时候.h里已经有Q_OBJECT了,解决的方法就是重新执行qmake,然后执行make.
本站所有文章由本站和原作者保留一切权力,仅在保留本版权信息、原文链接、原文作者的情况下允许转载,转载请勿删改原文内容,并不得用于商业用途。谢谢合作。
原文链接:[url]http://www.cuteqt.com/blog/?p=116[/url]
shiroki 发表于2009-6-22 09:56
有人提出了另外一个可能导致该问题的错误,那就是将类的声明和实现都放在.cpp文件中。这是初学者经常会做的事情。 要知道moc工具是不处理cpp文件的,所以如果你的Q_OBJECT宏写在cpp里moc是会直接忽略掉的。。。大家写代码的时候还是尽量遵循声明和实现分开的原则为佳。
wd007 发表于2009-6-22 19:16
呵呵,写的真不错,学习了一下
但有时候,安装完Qt后,却没有设置Qt的环境变量,是否会出现上述问题呢?
也会出现同样的问题,我就碰到过这样的问题
3.qvfb窗口为什么不能加载 HelloQT  窗口???
我是QTop 4.5.0版本,然后又装了 QTembedded 4.5.1版本
首先试验,单独运行HelloQT可以。
因为一般嵌入式设备上都是在framebuffer的方式,在X11上就是用qvfb来模拟framebuffer的。
我想让他跑在qvfb窗口:
#qmake -project
# qmake
# ./qvfb &      (此时出现qvfb窗口)
#./HelloQt -qws (此时单独出现HelloQT窗口,不在qvfb窗口内)
关掉 qvfb窗口,HelloQT窗口还在,也就说他们是分开的。
请问为什么不能加载进qvfb窗口呢?
备注-------------------------------
QMake version 2.01a
Using QT version 4.5.0 in /usr/lib
qmaklink  /usr/bin/qmake-qt4
./configure -qt-gfx-qvfb  -qt-kbd-qvfb -qt-mouse-qvfb进行配置 可解决
晕了,你跑的肯定是X11的应用呗。
要跑QtEmbedded的应用才会跑到qvfb里啊。(正解)