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

时间:2011-11-23 18:39:44

标签: 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();
}

但是当我尝试编译并将其与Qt Creator 2.3.1(Qt 4.7.4)链接时,我得到3个“未解析的外部符号”错误:

  •   

    main.obj:-1:错误:   LNK2001:未解析的外部符号
      “”public:virtual struct QMetaObject const * __thiscall MyApp :: metaObject(void)const“
      (?元对象@ @@ 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 ++中将声明和定义放在一个文件中并不是一种好的编程风格,但这不是重点。在我看来应该是可能的,因为这里没有任何语法错误。

4 个答案:

答案 0 :(得分:12)

使用下面的代码,并确保在构建之前运行qmake(构建&gt;运行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"

说明:当你包含Q_OBJECT宏时,这表示Qt会做一堆不是标准C ++的东西,比如信号和插槽。它通过运行moc来实现这一点,qmake在很大程度上是代码生成器。运行moc会创建元数据,以便在构建项目时,它知道{{1}}等文件。

答案 1 :(得分:3)

我认为你需要moc文件并在底部包含生成的main.moc。

答案 2 :(得分:0)

我认为这与QMake有关。并不是可执行应用程序无法看到导出的DLL类。这是该类的obj文件不存在。从QT Creator Build菜单运行QMake然后构建似乎工作。

Why does this Simple Qt Application not link

答案 3 :(得分:0)

我刚刚遇到同样的问题,它已经通过将我的标头的字符集从Unicode更改为ANSI来解决。