Qt + VS2010 - 无法解析的外部符号LNK2001

时间:2013-05-21 07:49:01

标签: c++ visual-studio-2010 qt debugging

我拥有的只是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的新手,希望找到解决方案,谢谢。

3 个答案:

答案 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%!!!

如果你觉得有用的话请大家好,堆栈没有让我发帖,希望它会让我发布这个。