0

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) はサンプル アプリケーションを表しており、ライブラリのコア機能をテストする必要があります。

4

1 に答える 1

1

この問題は、ファイルを#includeing していることが原因である可能性が最も高いです。.cpp

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

あなたはそれをすべきではありません、そしてあなたはそれを必要としません。sourceeditor.h対応するヘッダーと、必要に応じてヘッダーを含めるだけnovile_debug.hです。

次に、両方がプロジェクトの一部であることを確認してmain.cppくださいsourceeditor.cpp。これにより、コンパイラはこれらの翻訳単位の両方を処理し、リンカーは最終的に対応するオブジェクト コードをプログラムの実行可能ファイルにマージします。

于 2013-03-29T11:24:08.117 に答える