我只想启动一个简单的 QT 应用程序。我有main.cpp
,mainwindow.h
并且mainwindow.cpp
。但是,当我将代码复制并粘贴到 中时,这是有效的mainwindow.h
,mainwindow.cpp
我main.cpp
收到神秘的链接器错误。
什么有效
// mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QtWidgets/QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget* parent = nullptr);
~MainWindow();
private:
Ui::MainWindow* ui;
};
#endif
//mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent)
{
ui = new Ui::MainWindow;
ui->setupUi(this);
}
MainWindow::~MainWindow() { delete ui; }
//main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char **argv)
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
什么不起作用
//main.cpp
#include <QApplication>
#include "ui_mainwindow.h"
#include <QtWidgets/QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget* parent = nullptr);
~MainWindow();
private:
Ui::MainWindow* ui;
};
MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent)
{
ui = new Ui::MainWindow;
ui->setupUi(this);
}
MainWindow::~MainWindow() { delete ui; }
int main(int argc, char **argv)
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
这在链接过程中给我带来了以下错误:
/usr/bin/ld: /tmp/ccX909s9.ltrans1.ltrans.o: in function `MainWindow::~MainWindow()':
<artificial>:(.text+0x3): undefined reference to `vtable for MainWindow'
/usr/bin/ld: /tmp/ccX909s9.ltrans1.ltrans.o: in function `main':
<artificial>:(.text.startup+0x4a): undefined reference to `vtable for MainWindow'
经过一番搜索后,这个非常详细的错误意味着某个地方有一个虚拟函数未实现。我真的很努力地想明白这一切在这里有何重要意义。
作为参考,我是一名传统的 C 程序员,从我的角度来看,这些程序应该是相同的。我真的很想了解编译器此时正在寻找什么神奇的胡言乱语。