81

QObject からクラスを継承しました:

class Parent: public QObject
{
    Q_OBJECT
    QObject* cl;

public:
    Parent(QObject *parent=0):QObject(parent) {
        cl = NULL;
    }

    QObject* getCl() const {
        return cl;
    }
    void setCl(QObject *obj) {
        cl = obj;
    }
};

しかし、私が書くとき:

Parent ev;

次のエラーが表示されます。

main.obj:-1: error: LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall Parent::metaObject(void)const " (?metaObject@Parent@@UBEPBUQMetaObject@@XZ)

main.obj:-1: error: LNK2001: unresolved external symbol "public: virtual void * __thiscall Parent::qt_metacast(char const *)" (?qt_metacast@Parent@@UAEPAXPBD@Z)

main.obj:-1: error: LNK2001: unresolved external symbol "public: virtual int __thiscall Parent::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@Parent@@UAEHW4Call@QMetaObject@@HPAPAX@Z)
4

24 に答える 24

81

debugこの問題を解決するには、アプリケーションのフォルダーを削除してから再度実行する必要があります。

于 2013-01-05T14:35:12.107 に答える
12

問題は、.h ファイルをコンパイルするために Qt MOC コンパイラが必要だったことです。これは、QObject またはその子の 1 つを拡張するすべてのクラスに必要です。(私にとっては) ヘッダー ファイルを右クリックし、[プロパティ] を選択し、アイテム タイプを [Qt MOC 入力] に設定し、ヘッダーで [コンパイル] をクリックして、結果の moc_myfilename.cpp ファイルを事業。

于 2013-03-27T00:36:45.033 に答える
8

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

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

于 2016-07-12T09:09:44.807 に答える
7

moc ファイルが Visual Studio プロジェクトで生成された場合、それらがプロジェクトに含まれていない場合は、それらをプロジェクトに含めてから再構築してください。

于 2014-12-25T12:07:42.880 に答える
6

Visual Studio で同じ問題が発生し、次の手順を実行して解決しました。

  1. ソリューション エクスプローラーでヘッダー ファイルを右クリックします。
  2. プロパティ
  3. 「アイテム タイプ」を「カスタム ビルド ツール」に変更します。

次に、カスタム ビルド ツールの構成で:

  1. 一般に行く
  2. 「コマンドライン」を次のように設定します。

    "$(QTDIR)\bin\moc.exe" "%(フルパス)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(ファイル名).cpp" "-fStdAfx.h" "-f../ ../../src/ FileName.h " -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_NETWORK_LIB -DWIN32_LEAN_AND_MEAN -DDIS_VERSION=7 -D_MATH_DEFINES_DEFINED ""-I." .\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtNetwork"

  3. 「出力」を次のように設定します。

    .\GeneratedFiles\$(構成名)\moc_%(ファイル名).cpp

  4. 「追加の依存関係」を次のように設定します:
    $(QTDIR)\bin\moc.exe;%(FullPath)


正確な値は異なる場合があります。これらは通常、Qt プラグインを介して適用されます。

于 2016-08-31T02:39:55.110 に答える
5

cpp ファイルに Q_OBJECT クラス定義があるとき、Visual Studio 2012 でこの問題が発生しました。クラス定義をヘッダー ファイルに移動すると、問題が解決しました。

cppファイルをmocに追加することで、cppファイルでQ_OBJECTクラスをサポートできるはずですが、試していません。

于 2016-05-18T09:18:15.027 に答える
3

私の問題は、Qt マクロを使用したファイルの 1 つがモック化されなかったことです。Qt Plugin for Visual Studio はマクロを認識しないQ_NAMESPACEため、ファイルを moc'ing リストに追加しないことがわかりました。

したがって、この回答のソリューションを使用して、ファイルをマイク リストに追加しました。

「moc_*」が正常に生成された .h ファイルを見つけ、「カスタム ビルド ツール -> 一般」の​​すべての内容を新しい .h ファイル設定ページにコピーする必要があります。

DebugRelease-Modeの異なるオプションには注意してください。

その後、プロジェクトをビルドします。

DebugRelease-Modeでそれぞれ 1 回ビルドします。

最後に、生成された「moc_*」ファイルをプロジェクトに追加します。

これで、「moc_filename.cpp」がGenerated Files\DebugandにあるはずGenerated Files\Releaseです。

それぞれを右クリックして、プロパティを変更します。

  • のファイルDebug: 構成を に変更しRelease、次に に変更General->Excluded from buildyesます。
  • のファイルRelease: 構成を に変更しDebug、次に に変更General->Excluded from buildyesます。
于 2018-11-30T02:32:23.677 に答える
1

「 PIMPL」(プライベート実装) プログラミング パターンを採用しているときに、Qt で「プライベート クラス」を使用すると、この問題が発生しました。Qt は、ソース コード全体でこのモデルを使用しています。私自身、すっかり気に入ってしまいました。

この手法では、パブリック ヘッダー ファイルで前方宣言された「プライベート」クラスを使用します。このクラスは、「パブリック」クラス (つまり、「親」) によって使用されます。親は、プライベート クラスのインスタンスへのポインターをデータ メンバーとして保持します。

「プライベート」クラスは、パブリック クラスの cpp ファイル内で完全に定義されます。プライベート クラスのヘッダー ファイルはありません。

すべての「汚い仕事」は、そのプライベート クラスで行われます。これにより、通常、他のすべてのプライベート メンバー (データと関数の両方) を含む、パブリック クラスのすべての実装が非表示になります。

PIMPL パターンについて学習することを強くお勧めします。特に、内部の Qt ソースを読む場合は特にそうです。

そのコーディングスタイルをさらに説明することなく、この質問に関連するポイントは次のとおりです... Q_OBJECT「プライベート」クラスのcpp内でマクロを動作させて、シグナル/スロットなどを使用できるQObjectにするためには、明示的にする必要がありましたcpp 内のパブリック クラスに .moc を含めます

#include "MyPublicClass.moc"

この行に関する IDE の警告は無視してかまいません。

それが正確に問題になるかどうかはわかりませんが、cppの先頭ではなく、常にプライベートクラス定義の後に行われるインクルードが表示されます(インクルードは通常配置されます)。したがって、cpp レイアウトは次のようになります。

  1. 「通常の」インクルードが定義されています。
  2. プライベート クラスが定義されます。
  3. public クラスの moc は #include です。
  4. public クラスの実装が定義されています。
于 2014-03-06T22:37:34.240 に答える
1

私の場合 (VS2012 および Qt v4.8.4 で QtAdd-in を使用)、上記の提案はどれも機能しませんでした。何らかの理由で、VS は適切な moc ファイルを生成できませんでした (ビルド出力: 関連するクラスが見つかりません。出力が生成されません)。関連するヘッダーを手動でコンパイルすると (qt moc をコンパイラとして設定し、[コンパイル] をクリックすると)、空の moc ファイルが生成されました。 .

うまくいったのは、コマンドラインから必要なすべての moc をコンパイルし (moc -o moc_SomeClass.cpp SomeClass.h)、GeneratedFiles フォルダー内の間違った moc を置き換えることでした。

これは、プロジェクトを正常にビルドするための唯一の回避策 (大規模なプロジェクトにとって便利なものではありません) ですが、奇妙な VS/QtAdd-in の動作を実際に説明するものではありません。

于 2013-07-10T09:31:06.267 に答える
0

私の場合、上記のどれも機能しませんでしたが、完全に私の間違いでした。

私は.hファイルで仮想関数をオーバーライドしました(宣言しました)が、.cppでそれらを定義したことはありません:)

于 2015-02-19T16:35:05.670 に答える
0

これをヘッダーファイルに追加して問題を解決しました:

#ifndef MYCLASSNAME_H
#define MYCLASSNAME_H

... // all the header file content.

#endif
于 2016-01-11T14:36:17.350 に答える
0

これは、MingW から MSVC に切り替えたときに最近起こりました。私はプロトタイプ化されたクラス/構造体をクラスとしてリストしましたが、MingW は気にしませんでした。

classMSVC は、プロトタイピングに関してとの違いを明確に認識してstructいます。

いつか他の誰かを助けることを願っています。

于 2014-10-03T20:27:38.530 に答える
0

私は統合されたPerforce p4vクライアントを使用してVS2015で作業しています。私の場合、Perforce は moc ファイルをデポに追加しようとしましたが、この操作を元に戻すと、Perforce はこの moc ファイルをプロジェクトから削除して削除しました。ファイルは次のコンパイル後に再作成されましたが、プロジェクトに含まれていませんでした。問題が何であるかを最終的に理解したときに、生成されたファイルに手動で追加する必要があります。

于 2017-07-09T17:59:43.790 に答える