vtable への未定義の参照。Qtプロジェクトをコンパイルしようとしています
質問
使っています コード::ブロック 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 を使用する場合:
- ビルド→qmakeを実行
- ビルド → すべて再ビルド
問題がほぼ確実にあなたがコンパイルしていないか、生成された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つのことがうまくいきました。
- 変化
void process();
にvoid process() = 0;
- 作る
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 += コア