为什么这个简单的Qt应用程序没有链接

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等等.

  • 您很少需要明确包含任何`.moc`文件.Qt为您处理此问题.事实上,我曾经使用它的唯一时间是在创建像上面那样只有`main.cpp`的示例程序时.我认为原因是`qmake`会自动处理扫描头文件,但不会自动处理cpp文件,因为那些通常不包含需要`moc`-ed的东西.http://doc.qt.nokia.com/latest/moc.html (2认同)