我拥有的只是main.cpp
:
#include "myclass.h"
#include <QApplication>
#include <QTextEdit>
#include <QtGui>
class Notepad : public QWidget {
Q_OBJECT
public:
Notepad();
private slots:
void quit();
private:
QTextEdit *textEdit;
QPushButton *quitButton;
};
Notepad::Notepad()
{
textEdit = new QTextEdit();
quitButton = new QPushButton(tr("Quit"));
connect(quitButton, SIGNAL(clicked()), this, SLOT(quit()));
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(textEdit);
layout->addWidget(quitButton);
setLayout(layout);
setWindowTitle(tr("Notepad"));
}
void Notepad::quit()
{
QMessageBox messageBox;
messageBox.setWindowTitle(tr("Notepad"));
messageBox.setText(tr("Do you really want to quit?"));
messageBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
messageBox.setDefaultButton(QMessageBox::No);
if(messageBox.exec() == QMessageBox::Yes)
qApp->quit();
}
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
return app.exec();
}
错误信息:
1>main.obj : error LNK2001: Unresolvable external symbol "public: virtual struct QMetaObject const * __thiscall Notepad::metaObject(void)const " (?metaObject@Notepad@@UBEPBUQMetaObject@@XZ)
1>main.obj : error LNK2001: Unresolvable external symbol "public: virtual void * __thiscall Notepad::qt_metacast(char const *)" (?qt_metacast@Notepad@@UAEPAXPBD@Z)
1>main.obj : error LNK2001: Unresolvable external symbol "public: virtual int __thiscall Notepad::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@Notepad@@UAEHW4Call@QMetaObject@@HPAPAX@Z)
1>main.obj : error LNK2001: Unresolvable external symbol "public: static struct QMetaObject const Notepad::staticMetaObject" (?staticMetaObject@Notepad@@2UQMetaObject@@B)
我是VS和Qt的新手,希望找到解决方案,谢谢。
答案 0 :(得分:2)
问题很可能是你的cpp文件中有Q_OBJECT
class Notepad : public QWidget {
Q_OBJECT
要使其工作,您需要手动为您的cpp添加moc步骤以进行编译过程。或者将其移动到头文件中,它会自动完成
答案 1 :(得分:1)
您在Q_OBJECT
类中使用Notepad
,因此您应该moc
,编译moc输出并链接到生成的.obj文件。
通常,类在头文件中定义,因此您只需在moc
上运行Notepad.h
,使其生成moc_Notepad.cpp
并编译后者。在您的情况下,您应该在main.cpp
上运行moc,生成类似main.moc
的内容,并在main.cpp
底部添加#include "main.moc"
。
答案 2 :(得分:0)
我找到了我的解决方案(最后!),并认为我会在这里发布。 我找到了这个页面:http://msdn.microsoft.com/en-us/library/aa267384%28v=vs.60%29.aspx 我会在这里贴上关键件,但它会消失: 要使用此运行时库
Single-threaded (libc.lib)
Multithreaded (libcmt.lib)
Multithreaded using DLL (msvcrt.lib)
Debug Single-threaded (libcd.lib)
Debug Multithreaded (libcmtd.lib)
Debug Multithreaded using DLL (msvcrtd.lib)
这告诉你的是你需要的爬行动物库,以及你不需要的动物库 所以当我设置发布模式,多线程DLL(/ MD)时,它对我来说不起作用,问题是它在链接器(在Input下)有错误的值/ NODEFAULTLIB,它有3个条目,一个他们是我试图使用msvcrt.lib的那个。一旦我将其更改为:(保留所有其他非NODEFAULTLIB项的值)
/NODEFAULTLIB:libc.lib
/NODEFAULTLIB:libcmt.lib
/NODEFAULTLIB:libcd.lib
/NODEFAULTLIB:libcmtd.lib
/NODEFAULTLIB:msvcrtd.lib
(注意没有我感兴趣的非调试多线程dll lib msvcrt.lib) 它工作了110%!!!
如果你觉得有用的话请大家好,堆栈没有让我发帖,希望它会让我发布这个。