Kar*_*ten 6 c++ qt qt4 qt-creator moc
我试着像这样编写一个简单的Qt应用程序:
main.cpp:
#include <QApplication>
class MyApp : public QApplication {
Q_OBJECT
public:
MyApp(int argc, char* argv[]);
};
MyApp::MyApp(int argc, char* argv[]) :
QApplication(argc,argv) {
}
int main(int argc, char* argv[]) {
MyApp app(argc,argv);
return app.exec();
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试编译并将其与Qt Creator 2.3.1(Qt 4.7.4)链接时,我得到3个"未解析的外部符号"错误:
main.obj:-1:错误:LNK2001:未解析的外部符号
""public:virtual struct QMetaObject const*__thiscall MyApp :: metaObject(void)const"
(?metaObject @ MyApp @@ UBEPBUQMetaObject @@ XZ)".
main.obj:-1:错误:LNK2001:未解析的外部符号
""public:virtual void*__thiscall MyApp :: qt_metacast(char const*)"
(?qt_metacast @ MyApp @@ UAEPAXPBD @ Z)".
main.obj:-1:错误:LNK2001:未解析的外部符号
""public:virtual int __thiscall MyApp :: qt_metacall(enum QMetaObject :: Call,int,void**)"
(?qt_metacall @ MyApp @@ UAEHW4Call @ QMetaObject @ @ HPAPAX @ Z)".
我认为它们与Qt的MetaObjectCompiler有某种关联,但我无法找到解决方案.我知道在c ++中将声明和定义放在一个文件中并不是一种好的编程风格,但这不是重点.在我看来应该是可能的,因为这里没有任何语法错误.
Dav*_*eer 12
使用下面的代码,并确保在qmake
构建之前运行(Build> Run qmake).
#include <QApplication>
class MyApp : public QApplication {
Q_OBJECT
public:
MyApp(int argc, char* argv[]);
};
MyApp::MyApp(int argc, char* argv[]) :
QApplication(argc,argv) {
}
int main(int argc, char* argv[]) {
MyApp app(argc,argv);
return app.exec();
}
#include "main.moc"
Run Code Online (Sandbox Code Playgroud)
说明:当你包含Q_OBJECT
宏时,这表示Qt要做一堆不是标准C++的东西,比如信号和插槽.它通过运行来实现moc
,这在很大程度上是代码生成器.运行qmake
会创建元数据,以便在构建项目时,它知道要将哪些文件moc
等等.