为什么这个简单的Qt应用程序无法链接?

8
我试图编写一个像这样简单的 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 ”(?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 ++中将声明和定义放在一个文件中不被认为是良好的编程风格,但这不是问题的关键。在我看来,应该是可能的,因为从语法上讲并没有什么错误。

将“编译”更改为“链接”,因为这不是编译器问题。 - stijn
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来实现这一点,moc在很大程度上是代码生成器。运行qmake创建元数据,以便在构建项目时,它知道要对哪些文件进行moc等操作。


1
这个方法很好用。但是我仍然不知道为什么把声明部分放到一个单独的头文件中时,它可以在不包含 ".moc" 文件的情况下工作。 - Karsten
2
你很少需要显式地包含任何.moc文件。Qt会为您处理这个问题。事实上,我唯一使用它的时候是创建像上面那个示例程序一样的示例程序,其中只有一个main.cpp。我认为原因是qmake自动处理扫描头文件,但不处理cpp文件,因为这些文件通常不包含需要进行“ moc”的内容。http://doc.qt.nokia.com/latest/moc.html - Dave Mateer

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

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

0

我认为这与QMake有关。问题不在于可执行应用程序无法看到导出的DLL类,而是该类的obj文件不存在。从QT Creator Build菜单中运行QMake,然后构建似乎可以解决问题。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接