C++ 未找到文件:mainwindow.obj 我创建了一个GUI应用程序->QMainWindow 我在菜单上加了一个项目+插槽 我创建了一个新项目->QDialog

C++ 未找到文件:mainwindow.obj 我创建了一个GUI应用程序->QMainWindow 我在菜单上加了一个项目+插槽 我创建了一个新项目->QDialog,c++,qt,C++,Qt,我尝试使用slot方法显示创建的对话框,但出现以下错误: mainwindow.obj:-1:错误:LNK2019:未解析的外部符号“public:\u cdecl EditStudentDialog::EditStudentDialog(类QWidget*)”(???0EditStudentDialog)@@QEAA@PEAVQWidget@@@Z) 在函数“private:void\u cdecl主窗口::on\u actionNew\u triggered(void)”中引用(?on\u

我尝试使用slot方法显示创建的对话框,但出现以下错误:

mainwindow.obj:-1:错误:LNK2019:未解析的外部符号“public:\u cdecl EditStudentDialog::EditStudentDialog(类QWidget*)”(???0EditStudentDialog)@@QEAA@PEAVQWidget@@@Z) 在函数“private:void\u cdecl主窗口::on\u actionNew\u triggered(void)”中引用(?on\u actionNew_triggered@MainWindow@@AEAAXXZ)

mainwindow.obj:-1:错误:LNK2019:未解析的外部符号“public:virtual uu cdecl EditStudentDialog::~EditStudentDialog(void)”(??1EditStudentDialog@@UEAA@XZ)在函数“private:void\u cdecl主窗口::on\u actionNew\u triggered(void)”中引用(?on\u actionNew_triggered@MainWindow@@AEAAXXZ)

这是主窗口:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_actionNew_triggered();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "editstudentdialog.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_actionNew_triggered()
{
    EditStudentDialog editDialog;
    editDialog.setModal(true);
    editDialog.exec();
}
附言:我试图清理项目,然后建立它,但仍然是相同的问题


编辑2:我将Qt Creator 2.7与Qt 5.0.2一起使用,似乎editstudentdialog.obj文件创建不正确。尝试清理项目(Build->clean all),然后重新构建它。如果没有帮助,请检查是否已将editstudentdialog.cpp添加到.pro文件中的源变量中。如果仍然没有发生任何事情,请提供.pro文件

编辑:
正如下面提到的,您也可以尝试删除整个应用程序并重新创建它。

我刚刚遇到了同样的问题。 “全部建造”、“全部重建”、“全部清理”并没有帮助我解决“未解决的外部符号”问题

但是,在我完全删除了构建目录(在我的例子中是C:\dev\projects\qt\build-qt-gui-test-Desktop\u qt\u 5\u 0\u 2\u MSVC2010\u 32bit-Debug)之后,重建工作非常顺利

希望这能帮助你, 弗拉基米尔

解决方案
  • 右键单击project>Clean

  • 右键单击项目>运行qmake

  • 右键单击project>Build

  • 第一次跑步

  • 为什么有效
    之所以这样做有效,是因为runqmake更新了您的Makefile。由于某些原因,当您对项目进行更改(例如添加或删除文件)时,qt不会自动更新路径。运行qmake会强制qt更新项目的路径,从而使其能够找到mainwindow.obj文件。您可能只需要运行qmake,您的问题就会得到解决。

    我只想为其他需要创建一个全新项目来解决问题的人(主要是noob)添加以下答案:


    我的headers文件中有一个额外的插槽定义,它阻止了整个应用程序的运行,并给了我指向一个不是问题所在的函数的错误。仅供参考

    出现这种情况的另一个原因是.pro文件引用了不存在的内容。这发生在我身上,一旦我删除了这些引用,错误就消失了。

    发生这种情况的另一个原因是,如果它引用的函数在标题中声明为内联函数

    在我的情况下,修复方法是在错误消息中提到的QObject派生类的开头添加一个Q_对象宏。我不知道为什么没有收到更明确地指向丢失宏的消息。

    您的代码构建得很好,我刚刚检查过。环境设置可能有问题。如果您正在使用QtCreator,请选中左侧面板上的“项目”选项卡。你会发现有“构建设置”,也许你会注意到一些奇怪的东西。无论如何,请尝试再次创建一个新项目并将代码粘贴到那里。我删除了应用程序,然后再次创建,现在它可以工作了。感谢您的帮助:)+1是的,我通常必须删除影子构建目录,因为Qt Creator中的一些奇怪的构建中断。面对同样的问题,只有这个答案有帮助。
    #ifndef EDITSTUDENTDIALOG_H
    #define EDITSTUDENTDIALOG_H
    
    #include <QDialog>
    
    namespace Ui {
    class EditStudentDialog;
    }
    
    class EditStudentDialog : public QDialog
    {
        Q_OBJECT
    
    public:
        explicit EditStudentDialog(QWidget *parent = 0);
        ~EditStudentDialog();
    
    private:
        Ui::EditStudentDialog *ui;
    };
    
    #endif // EDITSTUDENTDIALOG_H
    
    
    #include "editstudentdialog.h"
    #include "ui_editstudentdialog.h"
    
    EditStudentDialog::EditStudentDialog(QWidget *parent) :
        QDialog(parent),
        ui(new Ui::EditStudentDialog)
    {
        ui->setupUi(this);
    }
    
    EditStudentDialog::~EditStudentDialog()
    {
        delete ui;
    }
    
    QT       += core gui
    
    greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
    
    TARGET = GUI1
    TEMPLATE = app
    
    
    SOURCES += main.cpp\
            mainwindow.cpp \
        editstudentdialog.cpp
    
    HEADERS  += mainwindow.h \
        editstudentdialog.h
    
    FORMS    += mainwindow.ui \
        editstudentdialog.ui