vtable への未定義の参照。Qtプロジェクトをコンパイルしようとしています

StackOverflow https://stackoverflow.com/questions/1552069

  •  20-09-2019
  •  | 
  •  

質問

使っています コード::ブロック 8.02 および mingw 5.1.6 コンパイラ。Qt プロジェクトをコンパイルすると、次のエラーが発生します。

c:ドキュメントと設定 fuzz desktop gui app_interface.cpp | 33 | `vtable for addressbook 'への未定義の参照

ファイルAddressBook.h:

 #ifndef ADDRESSBOOK_H
 #define ADDRESSBOOK_H

 #include <QWidget>

 class QLabel;
 class QLineEdit;
 class QTextEdit;

 class AddressBook : public QWidget
 {
     Q_OBJECT

 public:
     AddressBook(QWidget *parent = 0);

 private:
     QLineEdit *nameLine;
     QTextEdit *addressText;
 };

 #endif

ファイルAddressBook.cpp:

#include <QtGui>
#include "addressbook.h"

AddressBook::AddressBook(QWidget *parent)
     : QWidget(parent)
{
    QLabel *nameLabel = new QLabel(tr("Name:"));
    nameLine = new QLineEdit;

    QLabel *addressLabel = new QLabel(tr("Address:"));
    addressText = new QTextEdit;

    QGridLayout *mainLayout = new QGridLayout;
    mainLayout->addWidget(nameLabel, 0, 0);
    mainLayout->addWidget(nameLine, 0, 1);
    mainLayout->addWidget(addressLabel, 1, 0, Qt::AlignTop);
    mainLayout->addWidget(addressText, 1, 1);

    setLayout(mainLayout);
    setWindowTitle(tr("Simple Address Book"));
}
役に立ちましたか?

解決

警告:あなたはすでに.PROファイルを持っている場合は、これをしないでください - あなたはそれを失うことになる

、自動的にすべてのMOCのcppファイルが生成されることを確実にするために、あなたはqmakeのは、自動的に自分でものを書くのあなたのための.PROファイルを代わりに生成するために取得することができます。

ファイル名を指定して実行

qmake -project

プロジェクトディレクトリに、そしてqmakeのはためにMOCのcppファイルを生成するために、すべてのC ++のヘッダとソースファイルのためのディレクトリをスキャンします。

他のヒント

Qt Creator を使用する場合:

  1. ビルド→qmakeを実行
  2. ビルド → すべて再ビルド

問題がほぼ確実にあなたがコンパイルしていないか、生成されたmoc_AddressBook.cppファイルにリンクされていないということです。 (それはあなたのために生成されている必要があります - ?あなたは、コンパイルする前に、あなたのコードにQtのmocを実行している、右)

、もう少し徹底的Q_OBJECTのメタ情報システムをサポートするために必要なコードが含まれている余分な実装ファイルを作成するために、mocマクロ信号QtのQObjectツールに答えるために。あなたが任意のシグナルまたはスロットを持っていた場合、それは同様にそれらのためのいくつかのことをするだろう。

代替ソリューションはQ_OBJECTマクロを削除するかもしれません。おそらく、これを行うにはしたくないが、それは当面の問題に役立つだろう、それはあなたが提示したコードとは厳密には必要ではありません。

また、私はあなたの行に注意します

#include "addressbook.h"

おそらくにする必要があります:

#include "AddressBook.h"

あなたが質問にファイル名を提示する方法に基づいています。

あなたのMakefileを生成するqmakeのを使用していると仮定すると、AddressBook.hは、例えば、あなたの.PROファイルのHEADERSの変数で指定されていることを確認します。

HEADERS = AddressBook.h
純粋仮想関数を使用しながら、

私はこれを得ました。たとえば、

virtual void process();
しばらくます。

このエラーを与えました

virtual void process() = 0;

は、それが離れて行かせました。

この問題をグーグルでいます誰のために、すべての仮想関数が定義されていることを確認してください。 (「= 0」またはソースファイル内の完全な定義を介して) 私はMinGWのコンパイラではNetbeansを使用しています。

はcmakeのプロジェクトの場合、これは私の問題を修正し、ONにCMAKE_AUTOMOCを設定します。

#Find includes in corresponding build directories
set(CMAKE_INCLUDE_CURRENT_DIR ON)

# Instruct CMake to run moc automatically when needed.
set(CMAKE_AUTOMOC ON)

私は同じ問題を抱えていたが、私が代わりにエラーが消えた.cppのヘッダファイルに私のコンストラクタを定義しや否や。また、対応するMOCファイルは、ファイルシステム内とMakefileの部「compiler_moc_header_make_all」に欠けていました。私はその後、qmakeは大成功で構築され、最終的にすべてを走りました。私はMakefileをチェックするために行って、それが今であった。

、buildフォルダを削除Qtの創造主を再開し、それが働いた。

私は問題がなくなって、私はMakefileを削除し、再構築し、プロジェクトがMakefileを更新することはありません再構築し、同じ問題に来ます。 PS:実行コマンドラインから「作る」IDEよりも、あなたの詳細情報を与え、実際の問題を得るために役立つことがあります。

あなたはクラスの仮想関数を宣言し、あなたは自分の体を定義していない時に一つの原因がある。

私の場合はすべてが十分ではなかった再構築、私はビルドディレクトリを削除し、すべて再構築しなければならなかった - それは働いていた。

ファイルを.PROと.hファイルは、その前に「を含む」を持つことを確認します。 HEADERS + =含める/ファイル.h \            含める/ file2.h

保護された仮想関数を使用しようとすると、同じ問題が発生しました。2つのことがうまくいきました。

  1. 変化 void process();void process() = 0;
  2. 作る process() プライベートではなくパブリック
誤っデストラクタのプロトタイプを追加する場合は、

あなたは、同じエラーメッセージが表示されます。空のデストラクタ定義を追加するか、プロトタイプを削除します。

は、単にあなたのプロジェクトのためにRun qmake。これは、簡単にプロジェクトの名前を右クリックして行われ、Run qmakeをクリックすることができます。

MOCコンパイル用のヘッダファイルはヘッダに含まなければならない+ = ...変数ます:

私は同じツリー要素にmySource.hとmySource.cppを持ちたいので、

私は、SOURCES + = ...セクションにMyproject.proでヘッダファイルを移動しました。しかし、それはQT創造主のために故障しています。その結果、エラー「vtableのに未定義の参照は、」発生しました。 みたいだ: QTは、ヘッダーのみ+ = ...セクション(または可変)でMOCコンパイルのヘッダを検出します。 のセカンドanwer「私をhref="https://stackoverflow.com/questions/2555816/qt-linker-error-undefined-reference-to-vtable">も参照してください。 「問題を解決する方法をたくさん見てきたが、それがなぜ起こるかについて何の説明は、とてもここに行きません。」。私の心の中でこれが見つかりました。そして私の問題を解決するために私を助けている問題の正確、について説明があります。

Qt Creator を使用してプログラムをコンパイルして実行していますが、 Qtコマンドプロンプト 頻繁。迷惑なエラーを取り除くために私がやったことの 1 つvtable 何か 何か" は次の行を追加することによって行われます .pro ファイル。

テンプレート = アプリ

QT += コア

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top