Code :: Blocks 8.02とmingw 5.1.6コンパイラを使用しています。 Qtプロジェクトをコンパイルすると、このエラーが発生します。
C:\ Documents and Settings\The 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はすべてのC++ヘッダーとソースファイルのディレクトリをスキャンして、moc cppファイルを生成します。
Qt Creatorを使用する場合:
問題は、ほぼ間違いなく、生成されたmoc_AddressBook.cppファイルをコンパイルまたはリンクしていないことです。 (それはあなたのために生成されたはずです-あなたはコンパイルする前にあなたのコードでQtのmoc
を実行していますよね?)
もう少し詳しく答えるには、Q_OBJECT
マクロは、Qtのmoc
ツールにシグナルを送り、QObject
のメタ情報システムをサポートするために必要なコードを含む追加の実装ファイルを作成します。信号またはスロットがある場合、それらに対してもいくつかのことを行います。
別の解決策は、Q_OBJECT
マクロ。あなたはおそらくこれをしたくないでしょうが、それは差し迫った問題を助けるでしょう、そしてそれはあなたが提示したコードに厳密に必要ではありません。
また、あなたの行に注意してください:
#include "addressbook.h"
おそらく:
#include "AddressBook.h"
質問でのファイル名の表示方法に基づいています。
Qmakeを使用してMakefileを生成する場合、AddressBook.hが.proファイルのHEADERSの変数で指定されていることを確認してください。
HEADERS = AddressBook.h
純粋な仮想関数を使用しているときにこれを取得しました。例えば、
virtual void process();
このエラーを与えたが、
virtual void process() = 0;
消えた。
この問題をグーグルで調べている人のために、すべての仮想関数が定義されていることを確認してください。 ( "= 0"またはソースファイルの完全な定義を介して)NetBeansをMinGWコンパイラで使用しています。
CMakeプロジェクトの場合、CMAKE_AUTOMOCをONに設定すると、問題が修正されました。
#Find includes in corresponding build directories
set(CMAKE_INCLUDE_CURRENT_DIR ON)
# Instruct CMake to run moc automatically when needed.
set(CMAKE_AUTOMOC ON)
ビルドフォルダーを削除し、Qt Creatorを再起動し、動作しました
私は同じ問題を抱えていましたが、.cppではなくヘッダーファイルでコンストラクタを定義するとすぐにエラーが消えました。また、対応するmocファイルがファイルシステムとMakefileセクション「compiler_moc_header_make_all」にありませんでした。私はqmakeを実行し、最後にすべてが成功してビルドされました。 Makefileを確認しに行ったところ、そこにありました。
1つの原因は、クラスで仮想関数を宣言し、その本体を定義していない場合です。
私の場合、Rebuild Allでは十分ではなかったため、buildディレクトリを削除して、Rebuild Allを作成する必要がありました。
私は同じ問題に遭遇し、プロジェクトを再構築してもMakefileは更新されず、Makefileを削除して再構築すると、問題はなくなります。 ps:コマンドラインから 'make'を実行すると、IDEよりも詳細な情報が得られ、実際の問題を解決するのに役立ちます。
デストラクタプロトタイプを誤って追加すると、同じエラーメッセージが表示されます。空のデストラクタ定義を追加するか、プロトタイプを削除します。
保護された仮想関数を使用しようとしても同じ問題が発生しました。 2つのことが機能しました。
void process();
をvoid process() = 0;
に変更process()
をプライベートではなくパブリックにするMocコンパイル用のヘッダーファイルは、HEADERS + = ...変数に含める必要があります。
同じツリー要素にmySource.hとmySource.cppが必要なため、Myproject.proのヘッダーファイルをSOURCES + = ...セクションに移動しました。しかし、それはQT Creatorにとって誤りです。その結果、「vtableへの未定義の参照」エラーが発生しました。どうやら:QTはHEADERS + = ...セクション(または変数)でのみmocコンパイルのヘッダーを検出します。 other stackoverflow answer Second anwerの正しい説明も参照してください「問題を解決する多くの方法を見てきましたが、なぜ起こるかについての説明はありませんので、ここに行きます。」私の考えでは、これは問題の正確な説明であり、問題の発見と解決に役立ちます。
.proファイルに移動し、.hファイルの前に「include」が含まれていることを確認します。ヘッダー+ = include/file.h\include/file2.h
単にRun qmake
プロジェクト用。これは、プロジェクトの名前を右クリックしてRun qmake
。