2012-03-29 34 views
3

私はちょうどQtフレームワークでプログラミングを始めました。以下は、非常に単純なプログラムです:C++/Qt Q_OBJECTマクロでエラーが発生する

#include <QtCore/QCoreApplication> 
#include <QDebug> 

class MyClass : public QObject 
{ 
    Q_OBJECT 

public: 
    MyClass() {} 
}; 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 
    MyClass *c = new MyClass(); 
    return a.exec(); 
} 

しかし、私は&実行それコンパイルしようとすると、私は次のエラーが表示されます機能MyClass
を:vtable for MyClass
への未定義参照
しかし、私はを削除する場合QObjectマクロは正常に動作します。クラスはmain関数と同じファイルで定義されていることに注意してください。
私はWin 7で動作するQtバージョン4.7を使用しています。
この問題の原因は何ですか?

更新:別のヘッダーファイルでクラスを定義すると同じエラーが発生します。 mytimer.h:

#ifndef MYTIMER_H 
#define MYTIMER_H 
#include <QtCore> 

class MyTimer : public QObject 
{ 
    Q_OBJECT 

public: 
    QTimer *timer; 
    MyTimer(); 
public slots: 
    void DisplayMessage(); 
}; 


#endif // MYTIMER_H 

がmytimer.cpp:

#include "mytimer.h" 
#include <QtCore> 

MyTimer::MyTimer() 
{ 
    timer = new QTimer(); 
    connect(timer,SIGNAL(timeout()),this,SLOT(DisplayMessage())); 

    timer->start(1000); 
} 

void MyTimer::DisplayMessage() 
{ 
    qDebug() << "timed out"; 
} 

そしてこれはmain.cppにある:

#include <QtCore/QCoreApplication> 
#include <QDebug> 
#include "mytimer.h" 


int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 
    MyTimer *mt = new MyTimer(); 
    return a.exec(); 
} 
+0

あなたは、コードをコンパイルしてくださいするために使用している(S)コマンドを表示します。 – timday

+0

Qt2.7はかなり古いです...あなたは新しいバージョンを試しましたか? 4.8が最新だと思います。 – tmpearce

+0

@tmpearceそれは間違いだった4.7.4 –

答えて

3

あなたがしようとしている、qmakeのを使用して、それをコンパイルする必要がありますカスタムQObjectクラスのモックメソッドを作成します。 mocファイルの生成の詳細については、hereを参照してください。

例にはヘッダーファイルが含まれていないため、解析されず、mocファイルは生成されません。 MyClassを別のヘッダファイルで宣言し、moc生成ツールを実行する必要があります。

+0

質問を更新しました。 –

+1

これは参考になるかもしれませんが、あなたは** qmakeでコンパイルする必要はありません。どのようなコンパイル/ビルドシステムを使用していても、適切に構成する必要があります。 – tmpearce

1

QT Creatorを使用している場合は、プロジェクトをクリーンアップし、ビルドメニューでqmakeを実行する必要があります。 uは最初のqmakeを実行し、プロジェクトをきれいに、そして最終的にあなたのプロジェクトをビルドするいくつかの変更を適用するたびに

関連する問題