Qt应用程序中未定义的引用错误

Undefined reference errors in Qt application

本文关键字:引用 错误 未定义 应用程序 Qt      更新时间:2023-10-16

我有一个库和示例应用程序,由CMake驱动。所以,有一个类,我在库中使用:

sourceeditor.h

#ifndef SOURCEEDITOR_H
#define SOURCEEDITOR_H
#include <QWidget>
#include "novile_export.h"
namespace Novile
{
class SourceEditorPrivate;
class NOVILE_EXPORT SourceEditor : public QWidget
{
    Q_OBJECT
public:
    explicit SourceEditor(QWidget *parent = 0);
    ~SourceEditor();
private:
    SourceEditorPrivate * const d;
};
} // namespace Novile
#endif // SOURCEEDITOR_H

sourceeditor.cpp

#include <QtCore>
#include <QVBoxLayout>
#include <QWebView>
#include "novile_debug.h"
#include "sourceeditor.h"
namespace Novile
{
class SourceEditorPrivate
{
public:
    SourceEditorPrivate(SourceEditor *p = 0) :
        parent(p),
        aceView(new QWebView(p)),
        layout(new QVBoxLayout(p))
    {
        parent->setLayout(layout);
        layout->addWidget(aceView);
    }
    ~SourceEditorPrivate()
    {
    }
    void loadAceView()
    {
        aceView->load(QUrl("qrc:/ace.html"));
    }
private:
    SourceEditor *parent;
    QWebView *aceView;
    QVBoxLayout *layout;
};
SourceEditor::SourceEditor(QWidget *parent) :
    QWidget(parent),
    d(new SourceEditorPrivate(this))
{
    mDebug() << "Source Editor has been started";
    d->loadAceView();
}
SourceEditor::~SourceEditor()
{
}
} // namespace Novile

和例子:

main.cpp

#include <QApplication>
#include "../src/sourceeditor.cpp"
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    Novile::SourceEditor editor;
    editor.setGeometry(100, 50, 600, 300);
    editor.show();
    return app.exec();
}

然后我收到很多ld错误:

CMakeFiles/example.dir/main.cpp.o: In function `Novile::SourceEditor::SourceEditor(QWidget*)':
../src/sourceeditor.cpp:39: undefined reference to `vtable for Novile::SourceEditor'
../src/sourceeditor.cpp:39: undefined reference to `vtable for Novile::SourceEditor'
CMakeFiles/example.dir/main.cpp.o: In function `Novile::SourceEditor::~SourceEditor()':
../src/sourceeditor.cpp:46: undefined reference to `vtable for Novile::SourceEditor'
../src/sourceeditor.cpp:46: undefined reference to `vtable for Novile::SourceEditor'
collect2: error: ld returned 1 exit status

这个文件(main.cpp)是一个示例应用程序,它应该测试库的核心功能。

这个问题很可能是由于你正在#include一个.cpp文件:

#include "../src/sourceeditor.cpp"

你不应该那样做,你也不需要。只包括相应的标题sourceeditor.h,如果需要,novile_debug.h标题。

然后,确保main.cppsourceeditor.cpp都是你的项目的一部分,这样编译器会处理这两个翻译单元,链接器最终会将相应的目标代码合并到你的程序的可执行文件中。