我试着编写一个这样简单的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 ++中将声明和定义放在一个文件中并不是一种好的编程风格,但这不是重点。在我看来应该是可能的,因为这里没有任何语法错误。
答案 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然后构建似乎工作。
答案 3 :(得分:0)
我刚刚遇到同样的问题,它已经通过将我的标头的字符集从Unicode更改为ANSI来解决。