17

シンプルな Qt 4 アプリを開発し、独自のダイアログを作成しています。をサブクラス化し、マクロをクラス宣言ブロックQDialogに挿入するQ_OBJECTと...

[リンカ エラー] `vtable for MyDialog' への参照が未定義であり、moc コンパイラによって生成された moc_MyDialog.cpp がありません。

Windows XP と mingw で Qt 4.1.3 を使用しています。Qt が提供するビルド シェルからビルド プロセスをたどりました。qmake を使用して make ファイルを作成し、make コマンドですべてをコンパイルしました。

QPushButtonとそれぞれをサブクラス化する他のクラスがありQObjectますが、それらは正常にコンパイルされます。それらと壊れたものとの違いは見つかりません。

壊れたクラスには何かが欠けているに違いありませんが、それを見つけることができません。

4

6 に答える 6

36

「vtableforMyDialog」への未定義の参照は、mocファイルがないために発生します。ほとんどのc++コンパイラは、最初の仮想関数を含むオブジェクトファイルにvtable定義を作成します。qtオブジェクトをサブクラス化し、Q_OBJECTマクロを使用する場合、これはmoc*.cppファイルにあります。したがって、このエラーは、mocファイルが欠落していることを意味します。

私が考えることができる考えられる問題は次のとおりです。

  1. MyDialog.hクラスのヘッダーファイルは、qmakeファイルのHEADERSに追加されません。

  2. Q_OBJECTマクロを追加する前に、qmakeを実行してmakeファイルを生成しました。これにより、mocルールなしでmakeファイルが作成されました。これは、qmakeを再度実行するだけで簡単に修正できます。

  3. ダイアログは複数のクラスから派生しており、QDialogはそれが派生する最初のクラスではありません。qmakeが正しく機能するには、QObjectから派生した基本クラスがから継承される最初のクラスである必要があります。

  4. Qt Creatorを使用している場合、以前のデプロイメントが何らかの理由(アプリケーションが既に実行されているなど)で失敗した場合、このエラーが発生する可能性があります。その場合は、「プロジェクトのクリーンアップ」、「プロジェクトの再構築」、「実行」の順に実行してデプロイします。

于 2008-10-07T08:13:15.287 に答える
4

If you have your header file included, follow the steps:

  1. Right click on the project where you have added this.
  2. Hit 'Run qmake'.

This will will clear up the old references and build with th Q_OBJECT macro. QT doesn't do it on rebuild.

于 2012-05-17T00:59:08.877 に答える
1

拡張機能のないクラスが追加され、拡張機能が手動で追加された場合にのみ問題が発生することがわかりました。

この問題を解決するには、クラスの .h に Q_OBJECT を配置し、[ソース] -> [既存のファイルを追加...] を右クリックして、変更したクラスの .ccp を選択します。

于 2012-06-06T21:00:41.097 に答える
0

`vtable for MyDialog' への undefined reference というメッセージは、MyDialog の派生元であるクラスの純粋仮想関数の (MyDialog での) 実装の欠落の結果である可能性もあります。

于 2013-03-11T04:20:20.790 に答える
0

Windows で Qt プログラムをビルドするには、 CMakeを使用することをお勧めします。ビルド ファイルに適切なファイルを追加することを忘れないようにします。

追加の価値は、Visual Studio ソリューション ファイルから make/nmake ビルド ファイルを生成できることです。また、Visual Studio のソースから Qt をコンパイルすると、MS IDE/コンパイラでコーディングとビルドの両方が可能になります。

これはもちろん、Visual Studio をまったく使用している場合です。

于 2008-10-08T08:33:33.140 に答える
0

qmakeを使用していますか?おそらく、.cpp ファイルを SOURCES に、.h ファイルを qmake ファイルの HEADERS 変数に追加しなかったのでしょうか?

于 2008-10-07T07:38:05.530 に答える