55

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

20 に答える 20

51

Qt Creator を使用する場合:

  1. ビルド→qmakeを実行
  2. ビルド → すべて再ビルド
于 2010-07-14T17:21:50.787 に答える
47

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

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

走る

qmake -project

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

于 2009-10-12T04:51:10.400 に答える
16

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

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

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

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

#include "addressbook.h"

おそらく次のようになります。

#include "AddressBook.h"

質問でファイル名をどのように提示したかに基づいています。

于 2009-10-12T00:53:17.850 に答える
10

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

HEADERS = AddressBook.h
于 2009-10-12T02:18:19.673 に答える
4

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

virtual void process();

このエラーが発生しましたが、

virtual void process() = 0;

それをなくしました。

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

于 2011-04-02T05:14:41.057 に答える
3

CLion を使用して同じ問題に遭遇し、これらの行を CMakeLists.txt に追加して解決しました

set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)

https://www.jetbrains.com/help/clion/qt-tutorial.html#qt-setup-in-clionを参照してください

于 2020-09-15T00:34:23.830 に答える
2

ビルドフォルダーを削除し、Qt Creatorを再起動すると機能しました

于 2011-03-29T12:51:29.853 に答える
2

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

于 2009-12-02T19:54:14.237 に答える
1

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

于 2010-02-26T02:55:13.067 に答える
1

私の場合、すべてを再構築するだけでは十分ではありませんでした。ビルド ディレクトリを削除して、すべてを再構築する必要がありました。

于 2015-04-19T20:58:38.367 に答える
1

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

于 2011-11-07T13:03:39.650 に答える
0

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

于 2010-08-10T18:22:17.867 に答える
0

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

  1. void process();に変更void process() = 0;
  2. 非公開process()ではなく公開にする
于 2014-10-06T21:34:12.587 に答える
0

CMake

CMake を使用している場合、.cpp ファイルと .h ファイルが moc と同じフォルダーにない場合、興味深いことに、デフォルトではメタ ファイルの生成に失敗します :)

于 2021-03-03T13:10:10.283 に答える