8

我尝试编写一个简单的 Qt 应用程序,如下所示:

主.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:虚拟结构 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++ 中将声明和定义放在一个文件中并不被认为是好的编程风格,但这不是重点。在我看来,这应该是可能的,因为这里没有语法错误。

4

4 回答 4

13

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

于 2011-11-23T18:58:55.593 回答
3

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

于 2011-11-23T18:46:14.230 回答
0

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

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

于 2013-09-20T19:35:11.883 回答
0

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

于 2017-05-12T02:09:40.913 回答