Файл не найден: mainwindow.obj

  1. Я создал приложение с графическим интерфейсом -> QMainWindow
  2. Добавил 1 пункт в меню + слот.
  3. Я создал новый элемент -> QDialog
  4. В методе слота я пытаюсь показать созданный диалог, но получаю следующие ошибки:

    mainwindow.obj:-1: ошибка: LNK2019: неразрешенный внешний символ "public: __cdecl EditStudentDialog::EditStudentDialog (класс QWidget *)" (??0EditStudentDialog@@QEAA@PEAVQWidget@@@Z), на который ссылается функция "private: void __cdecl MainWindow::on_actionNew_triggered(void)" (?on_actionNew_triggered@MainWindow@@AEAAXXZ)

    mainwindow.obj:-1: ошибка: LNK2019: неразрешенный внешний символ "public: virtual __cdecl EditStudentDialog::~EditStudentDialog(void)" (??1EditStudentDialog@@UEAA@XZ), на который ссылается функция "private: void __cdecl MainWindow::on_actionNew_triggered (пусто)" (?on_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();
}

Это диалоговое окно (просто пустое, без элементов управления):

#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;
}

Что я делаю неправильно?

РЕДАКТИРОВАТЬ: это файл .pro

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

PS: я попытался очистить проект, а затем собрать его, но все та же проблема.

РЕДАКТИРОВАТЬ 2: я использую Qt Creator 2.7 с Qt 5.0.2


person Jack Willson    schedule 07.04.2013    source источник


Ответы (7)


Кажется, что файл editstudentdialog.obj создан неправильно. Попробуйте очистить проект (Build->Clean all) и снова собрать его. Если это не помогает, проверьте, добавлен ли editstudentdialog.cpp в переменную SOURCES в вашем .pro-файле. Если по-прежнему ничего не происходит, предоставьте файл .pro.

РЕДАКТИРОВАТЬ: Как упоминалось ниже, вы также можете попытаться удалить все приложение и создать его снова.

person Effendi    schedule 07.04.2013
comment
Ваш код строится нормально, я только что проверил его. Вероятно, что-то может быть не так с настройками среды. Если вы используете QtCreator, проверьте вкладку «Проекты» на левой панели. Вы найдете там «Настройки сборки», возможно, вы заметите что-то странное. В любом случае попробуйте создать еще раз новый проект и вставить туда свой код. - person Effendi; 07.04.2013
comment
Я удалил приложение, а затем создал его снова, и теперь оно работает. - person Jack Willson; 07.04.2013

Решение

  1. Щелкните правой кнопкой мыши проект> Очистить

  2. Щелкните правой кнопкой мыши проект> Запустить qmake

  3. Щелкните правой кнопкой мыши проект> Построить

  4. Запустил - получилось с первого раза

Почему это работает

Причина, по которой это сработало, заключается в том, что Run qmake обновляет ваш Makefile. По какой-то причине qt не обновляет пути автоматически, когда вы вносите изменения в свой проект, такие как добавление или удаление файлов. Запуск qmake заставляет qt обновить пути для вашего проекта, что позволяет найти файл mainwindow.obj. Вероятно, вы могли бы просто запустить qmake, и ваша проблема была бы решена.

person Pete McFarlane    schedule 09.05.2013

Я только что столкнулся с той же проблемой. «Построить все», «Перестроить все», «Очистить все» не помогли мне решить проблему «неразрешенного внешнего символа».

Однако после того, как я полностью удалил каталог сборки (в моем случае C:\dev\projects\qt\build-qt-gui-test-Desktop_Qt_5_0_2_MSVC2010_32bit-Debug), перестроение сработало как чудо.

Надеюсь, это поможет вам, владимир

person Vladimir L.    schedule 16.04.2013
comment
Спасибо за помощь :) +1 - person Alker; 07.12.2013
comment
Да, обычно мне приходится удалять каталог теневой сборки для некоторых более странных разрывов сборки в Qt Creator. - person kayleeFrye_onDeck; 17.08.2017

Я просто хотел добавить этот ответ для всех (в основном нубов), которым пришлось создать совершенно новый проект для решения проблемы:

У меня было дополнительное определение слота в моем файле заголовков, которое препятствовало запуску всего приложения и выдавало мне ошибки, указывающие на функцию, которая не была проблемой. к вашему сведению.

person Rachael    schedule 10.07.2014
comment
Столкнулся с той же проблемой, и только этот ответ помог. - person semanser; 28.02.2018

Другая причина, по которой это может произойти, заключается в том, что файл .pro ссылается на что-то несуществующее. Это случилось со мной, и как только я удалил эти ссылки, ошибки исчезли.

person Admin Voter    schedule 18.11.2014

В моем случае исправление состояло в том, чтобы добавить макрос Q_OBJECT в начало класса, производного от QObject, который упоминался в сообщениях об ошибках. Я не знаю, почему я не получал сообщений, в которых конкретно указывалось на отсутствующий макрос.

person Stefan Monov    schedule 17.03.2017

другая причина, по которой это происходит, заключается в том, что ваша функция, на которую она ссылается, объявлена ​​как встроенная функция в заголовке.

person SteveEng    schedule 13.03.2016