web-dev-qa-db-ja.com

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

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"));
}
51
TheFuzz

警告:既に.proファイルがある場合はこれを行わないでください-それは失われます!

すべてのmoc cppファイルが自動的に生成されるようにするには、qmakeを使用して、自分で作成する代わりに.proファイルを自動的に生成できます。

走る

qmake -project

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

43
blwy10

Qt Creatorを使用する場合:

  1. ビルド→qmakeの実行
  2. ビルド→すべて再ビルド
47
Anurag Verma

問題は、ほぼ間違いなく、生成されたmoc_AddressBook.cppファイルをコンパイルまたはリンクしていないことです。 (それはあなたのために生成されたはずです-あなたはコンパイルする前にあなたのコードでQtのmocを実行していますよね?)

もう少し詳しく答えるには、Q_OBJECTマクロは、Qtのmocツールにシグナルを送り、QObjectのメタ情報システムをサポートするために必要なコードを含む追加の実装ファイルを作成します。信号またはスロットがある場合、それらに対してもいくつかのことを行います。

別の解決策は、Q_OBJECTマクロ。あなたはおそらくこれをしたくないでしょうが、それは差し迫った問題を助けるでしょう、そしてそれはあなたが提示したコードに厳密に必要ではありません。

また、あなたの行に注意してください:

#include "addressbook.h"

おそらく:

#include "AddressBook.h"

質問でのファイル名の表示方法に基づいています。

16

Qmakeを使用してMakefileを生成する場合、AddressBook.hが.proファイルのHEADERSの変数で指定されていることを確認してください。

HEADERS = AddressBook.h
9
Jeremy Friesner

純粋な仮想関数を使用しているときにこれを取得しました。例えば、

virtual void process();

このエラーを与えたが、

virtual void process() = 0;

消えた。

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

4
Jesse Victors

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)
3
Dumisani Kunene

ビルドフォルダーを削除し、Qt Creatorを再起動し、動作しました

2
yolo

私は同じ問題を抱えていましたが、.cppではなくヘッダーファイルでコンストラクタを定義するとすぐにエラーが消えました。また、対応するmocファイルがファイルシステムとMakefileセクション「compiler_moc_header_make_all」にありませんでした。私はqmakeを実行し、最後にすべてが成功してビルドされました。 Makefileを確認しに行ったところ、そこにありました。

2
yan bellavance

1つの原因は、クラスで仮想関数を宣言し、その本体を定義していない場合です。

1
agus

私の場合、Rebuild Allでは十分ではなかったため、buildディレクトリを削除して、Rebuild Allを作成する必要がありました。

1
Alexey Petrenko

私は同じ問題に遭遇し、プロジェクトを再構築してもMakefileは更新されず、Makefileを削除して再構築すると、問題はなくなります。 ps:コマンドラインから 'make'を実行すると、IDEよりも詳細な情報が得られ、実際の問題を解決するのに役立ちます。

1
user281754

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

0
Emil Fors

保護された仮想関数を使用しようとしても同じ問題が発生しました。 2つのことが機能しました。

  1. void process();void process() = 0;に変更
  2. process()をプライベートではなくパブリックにする
0
khafen

Mocコンパイル用のヘッダーファイルは、HEADERS + = ...変数に含める必要があります。

同じツリー要素にmySource.hとmySource.cppが必要なため、Myproject.proのヘッダーファイルをSOURCES + = ...セクションに移動しました。しかし、それはQT Creatorにとって誤りです。その結果、「vtableへの未定義の参照」エラーが発生しました。どうやら:QTはHEADERS + = ...セクション(または変数)でのみmocコンパイルのヘッダーを検出します。 other stackoverflow answer Second anwerの正しい説明も参照してください「問題を解決する多くの方法を見てきましたが、なぜ起こるかについての説明はありませんので、ここに行きます。」私の考えでは、これは問題の正確な説明であり、問​​題の発見と解決に役立ちます。

0

.proファイルに移動し、.hファイルの前に「include」が含まれていることを確認します。ヘッダー+ = include/file.h\include/file2.h

0
Phil

単にRun qmakeプロジェクト用。これは、プロジェクトの名前を右クリックしてRun qmake

0
Sunit Gautam