ホームページ  >  記事  >  バックエンド開発  >  Qt アプリケーションで「Q_OBJECT リンク エラー: \'vtable への未定義の参照\'」が発生するのはなぜですか?

Qt アプリケーションで「Q_OBJECT リンク エラー: \'vtable への未定義の参照\'」が発生するのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-28 03:51:02241ブラウズ

 Why Am I Getting a

Q_OBJECT リンク エラー: 'vtable への未定義の参照'

次の Qt コード スニペットを考慮してください:

<code class="cpp">class T : public QObject, public QGraphicsItem
{
    Q_OBJECT

public:
    T() {}

    QRectF      boundingRect() const {return QRectF();}
    void        paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
                      QWidget *widget) {}
};

int main()
{
    T t;
    return 0;
}</code>

このコードをコンパイルするとき、次のようなリンカー エラーが発生する可能性があります:

undefined reference to `vtable for T'
undefined reference to `vtable for T'
...

解決策:

このエラーは通常、クラスの MOC 生成ユニットがリンク プロセスに含まれていない場合に発生します。 MOC ユニットには、Q_OBJECT マクロなど、クラスに関するメタ情報が含まれています。

考えられる原因と修正:

  • 別個のヘッダー ファイル: クラス宣言が別のヘッダー ファイルにあることを確認してください。ビルド システムは、クラス宣言を見つけるために実装ファイルをスキャンしていない可能性があります。
  • MOC 生成: MOC ユニットが生成されたことを確認します。 qmake を再度実行して、qmake に必要な MOC ルールを強制的に作成させます。 Qt Creator を使用している場合は、プロジェクトのコンテキスト メニューから [Run qmake] を選択します。
  • Q_OBJECT マクロ: クラス宣言で Q_OBJECT マクロが適切に使用されていることを確認します。これはコンストラクター定義の前に配置する必要があります。
  • 継承: このクラスが以前に Qt メタオブジェクト システムに属していない場合 (例: Q_OBJECT マクロがないか、別のクラスから継承された場合) )、qmake を再実行するか、プロジェクト ファイルに重要でない変更を加えて qmake の実行をトリガーします。

以上がQt アプリケーションで「Q_OBJECT リンク エラー: \'vtable への未定義の参照\'」が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。