2011-11-23 8 views
6

をリンクしません。私はこのような単純なのQtアプリケーションを作成してみました:はなぜ、このシンプルな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のでそれをコンパイルしてリンクしようとしたがクリエーター2.3.1(Qtの4.7.4)私は3 "未解決の外部シンボル" エラーを取得:

I think they are somehow related to the MetaObjectCompiler of Qt, but I can't figure out a solution. I know it's not considered good programming style in c++ to put declarations and definitions in one file, but that's not the point here. In my opinion it should be possible since there is nothing syntactically wrong here.

+0

'コンパイル'が 'リンク'に変更されました。これはコンパイラの問題ではありません。 – stijn

答えて

12

ビルドする前に、以下のコードを使用して、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などのファイルを知るようにメタデータが作成されます。

+1

これは正常に機能しました。しかし、私はまだ別のヘッダファイルに宣言部を置くときに.mocファイルを含めずに、なぜそれが動作するのか分かりません。 – Karsten

+2

明示的に '.moc'ファイルを含める必要はほとんどありません。 Qtがこれを処理します。実際、私がこれまで使ってきた唯一の時間は、上記のようなサンプルプログラムを作成するときに 'main.cpp'しかないところです。なぜなら、通常は 'moc'-edが必要なものを含んでいないので、' qmake'は自動的にヘッダファイルをスキャンしますが、cppファイルはスキャンしません。 http://doc.qt.nokia.com/latest/moc.html –

3

私はあなたがファイルをMOCと下部の結果main.mocを含める必要があると思います。

0

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

Why does this Simple Qt Application not link

0

私はちょうど同じ問題に会った、そしてそれは、UnicodeからANSIへの私のヘッダの文字セットを変更することで解決されています。

関連する問題