質問

単純な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 をそれぞれサブクラス化する他のクラスがありますが、それらは正常にコンパイルされます。それらと壊れたものとの違いを見つけることができません。

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

役に立ちましたか?

解決

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

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

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

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

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

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

他のヒント

ヘッダーファイルが含まれている場合は、次の手順を実行します。

  1. これを追加したプロジェクトを右クリックします。
  2. 「qmakeを実行」を押します。

これにより、古い参照がクリアされ、Q_OBJECTマクロでビルドされます。 QTは再構築時にそれを行いません。

この問題は、拡張子のないクラスを追加してから、拡張子を手動で追加した場合にのみ表示されることがわかりました。

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

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

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

追加の値は、そこからmake / nmakeビルドファイル、Visual Studioソリューションファイルを生成できることです。また、Visual StudioのソースからQtをコンパイルすると、MS IDE /コンパイラでコードを作成し、ビルドすることができます。

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

「vtable for MyDialog」へのメッセージの未定義参照は、MyDialogの派生元のクラスの純粋な仮想関数の(MyDialogでの)実装の欠落の結果である可能性もあります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top