0

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

4

3 回答 3

2

问题可能是您的 cpp 文件中有 Q_OBJECT

class Notepad : public QWidget {
    Q_OBJECT

要使其正常工作,您需要手动将 cpp 的 moc 步骤添加到编译过程中。或者把它移到头文件,它会自动完成

于 2013-05-21T08:01:39.863 回答
1

Q_OBJECT在你的Notepad类中使用,所以你应该moc编译 moc 输出并与生成的 .obj 文件链接。

通常,类是在头文件中定义的,因此您只需在moc. 上运行Notepad.h,使其生成moc_Notepad.cpp并编译后者。在您的情况下,您应该在您的 , 上运行 moc ,在add的底部main.cpp生成类似and 的内容。main.mocmain.cpp#include "main.moc"

于 2013-05-21T08:01:09.010 回答
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) 

这告诉你的是你需要的runtile库,以及你不需要的。
因此,当我设置发布模式、多线程 DLL (/MD) 时,它对我不起作用,问题是它在链接器中(在输入下)有 /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%!

如果您觉得有用,请点赞,堆栈暂时不让我发帖,希望它能让我发这个。

于 2015-01-02T21:30:33.593 回答