8

次のような単純な Qt アプリケーションを作成しようとしました。

main.cpp :

#include <QApplication>

class MyApp : public QApplication {
        Q_OBJECT
public:
        MyApp(int argc, char* argv[]);
};

MyApp::MyApp(int argc, char* argv[]) :
        QApplication(argc,argv) {
}

int main(int argc, char* argv[]) {
    MyApp app(argc,argv);
    return app.exec();
}

しかし、Qt Creator 2.3.1 (Qt 4.7.4) でコンパイルしてリンクしようとすると、3 つの「未解決の外部シンボル」エラーが発生します。

  • main.obj:-1: エラー: LNK2001: 未解決の外部シンボル
    ""パブリック: 仮想構造体 QMetaObject const * __thiscall MyApp::metaObject(void)const "
    (?metaObject@MyApp@@UBEPBUQMetaObject@@XZ)".

  • main.obj:-1: エラー: LNK2001: 未解決の外部シンボル
    ""public: virtual void * __thiscall MyApp::qt_metacast(char const*)"
    (?qt_metacast@MyApp@@UAEPAXPBD@Z)".

  • main.obj:-1: エラー: LNK2001: 未解決の外部シンボル
    ""public: virtual int __thiscall MyApp::qt_metacall(enum QMetaObject::Call,int,void * *)"
    (?qt_metacall@MyApp@@UAEHW4Call@QMetaObject@ @HPAPAX@Z)".

QtのMetaObjectCompilerに何らかの関係があると思いますが、解決策がわかりません。宣言と定義を 1 つのファイルに入れることは、C++ で適切なプログラミング スタイルとは見なされないことはわかっていますが、それはここでのポイントではありません。私の意見では、ここには構文的に間違っているものは何もないので、可能であるはずです。

4

4 に答える 4

13

以下のコードを使用し、ビルドする前に必ず実行qmake([ビルド] > [qmake の実行]) してください。

#include <QApplication>

class MyApp : public QApplication {
  Q_OBJECT
public:
  MyApp(int argc, char* argv[]);
};

MyApp::MyApp(int argc, char* argv[]) :
  QApplication(argc,argv) {
}

int main(int argc, char* argv[]) {
  MyApp app(argc,argv);
  return app.exec();
}

#include "main.moc"

説明:マクロを含めると、Q_OBJECTシグナルやスロットなど、標準の C++ ではない一連の処理を行うように Qt に信号が送られます。これはmoc、大部分がコード ジェネレーターである を実行することによって行われます。実行するとメタデータが作成されるため、プロジェクトがビルドされたときに、どのファイルを実行するかなどqmakeがわかります。moc

于 2011-11-23T18:58:55.593 に答える
3

ファイルを moc し、結果の main.moc を下部に含める必要があると思います。

于 2011-11-23T18:46:14.230 に答える
0

これはQMakeと関係があると思います。実行可能アプリがエクスポートされた DLL クラスを認識できないわけではありません。クラスのobjファイルが存在しないということです。QT Creator の [ビルド] メニューから QMake を実行すると、ビルドが機能するようです。

このシンプルな Qt アプリケーションがリンクしないのはなぜですか

于 2013-09-20T19:35:11.883 に答える