web-dev-qa-db-ja.com

Qt metaObjectリンカーの問題

QtをVsに統合し、.proファイルをコンパイルしようとすると、次のエラーが発生します。

Error   9   error LNK2001: unresolved external symbol "public: virtual int __thiscall Multiplication_dialog::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@Multiplication_dialog@@UAEHW4Call@QMetaObject@@HPAPAX@Z)     

Error   7   error LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall Multiplication_dialog::metaObject(void)const " (?metaObject@Multiplication_dialog@@UBEPBUQMetaObject@@XZ)  


    Error   8   error LNK2001: unresolved external symbol "public: virtual void * __thiscall Multiplication_dialog::qt_metacast(char const *)" (?qt_metacast@Multiplication_dialog@@UAEPAXPBD@Z)    

これで何をしますか?

21
smallB

通常、foo.hのmoc_foo.cpp(Q_OBJECTでマークされたクラスを含む)がプロジェクトでコンパイルまたはリンクされていない場合、これらのエラーが発生します。

QtプロジェクトをVSで機能させるには

  1. 'qmake -tp vc'を使用して.vcprojファイルを作成するか、
  2. すべてのmocマジックを自動的に処理するQt Visual Studioアドインを使用します(ただし、VC Expressバージョンでは機能しません)。

アドインを使用する場合は、moc_foo.cppの作成をトリガーできます。

  • 問題のオブジェクトのヘッダーファイルがVSプロジェクトに表示されていることを確認してください
  • リストアイテム
  • multiplication_dialogのヘッダーファイルからQ_OBJECTのすべての出現を削除します。
  • ファイルを保存する
  • q_OBJECTを再度追加
  • ファイルを保存する

これで、ソリューションエクスプローラーの「生成されたファイル」フォルダーにmoc_multiplication_dialog.cppの2つのバージョンがあるはずです。 1つは「デバッグ」用、もう1つは「リリース」用です。これらのファイルの1つがnotがビルドから除外されていることを確認してください。

17
jobor

今日も同じリンカエラーに直面しましたが、それは小さなずれが原因でした。

Cpp/uiファイルをプロジェクトに手動で追加しましたが、ヘッダーファイルをヘッダーファイルとして明示的に追加するのを忘れていました。コンパイルすると、上記と同様のエラーメッセージが表示され、ビルドのデバッグ(またはリリース)ディレクトリにmoc _ *。cppファイルが生成されませんでした。それはそれほど明らかな間違いではありませんでした。qmakeは文句を言わず、リンカーメッセージ以外にエラーはありませんでした。

したがって、誰かが同じ問題に再び遭遇した場合(または同じコピーと貼り付けを間違えた場合):ヘッダーファイルもプロジェクトファイルに追加されていることを確認してください

15
michael_s

書籍「Qt 4を使用したC++ GUIプログラミング」(19ページ)から引用:mocが正しく機能するためには、実装ファイルとは別のヘッダーファイルにクラス定義を配置する必要があります。したがって、クラスに2つのファイルMultiplication_dialog.hとMultiplication_dialog.cppを書き込む必要があります。そして、makefileを再作成する必要があります!

6
Grunelf

さて、今日私はおそらく同じ問題に直面しました。スレッドがかなり古いことを知っています。しかし、それはまだ誰かを助けるかもしれません。

私の場合に起こったことはmocmoc_ .cppファイルがVCもコンパイルする必要があることを認識していません。そのため、mocで生成されたファイルを手動で追加してコンパイルしました。

4
Neel Basu

現在、QT 5.4アドインを使用してVS 2013で作業しています。アドインを使用してプロジェクトをビルドすると、モック処理が自動的に処理されるため、作業が簡単になります。 Qt metaObjectの問題によるリンカーエラーの問題を防ぐには:

  1. クラス宣言に含まれているすべてのヘッダーファイルでQ_OBJECTのすべてのインスタンスをコメント化します。

  2. ソリューションを構築する

  3. ヘッダーファイル内のQ_OBJECTのすべてのインスタンスのコメントを外します。

  4. ソリューションを再構築します。ここで、すべてのヘッダーファイルとcppファイルが再コンパイルされ、moc'ingが自動的に行われます。次に、リンカエラーが処理されます。

3
John Aggrey

Qt Addin for VSを使用したときに同じ問題が発生しました。mocファイルare not included into projectビルド後。これらのエラーをプロジェクトに含めました。

1
Akın Yılmaz

プロジェクトの。proを再起動してみてください。

0
Patapoom

上記のかなり長い説明。
メニューバーのQt Creatorの使用:
ビルド> qmakeを実行
ビルド>すべてビルド

0
Richard Jessop