2013-10-04 33 views
7

最近クラスに信号を追加する必要があったので、QObjectから継承するようにクラスを変更し、Q_OBJECTマクロをクラス定義に追加しました。QObjectから継承した後のQt "signal undefined reference error"

// File clicommand.h 
#include <QString> 
#include <QStringList> 
#include <QTcpSocket> 
#include "telnetthread.h" 
class CLICommand : public QObject 
{ 
Q_OBJECT 
public: 
    CLICommand(TelnetThread *parentTelnetThread); 
signals: 
    void signal_shutdown_request(); 
private: 
    TelnetThread *m_parentTelnetThread; 

と2番目のエラー「『CLICommandためのvtable』の信号未定義の参照エラー」:そうするので、私は以下のクラスのライン上のエラー「『CLICommandためのvtable』の信号未定義の参照エラー」を取得します(メンバ変数をintializing)下の行に:I信号を発する場合

// File clicommand.cpp 
#include <QDebug> 
#include <QTcpSocket> 
#include <QTextStream> 
#include "version.h" 
#include "clicommand.h" 
#include "telnetthread.h" 
#include "logger.h" 
CLICommand::CLICommand(TelnetThread *parentTelnetThread) 
    : m_parentTelnetThread(parentTelnetThread) 
{ 
} 

とちょうどここにあります。

// file shutdown_clicommand.cpp 
#include <QIODevice> 
#include "clicommand.h" 
#include "logger.h" 
#include "version.h" 
void CLICommand::execute_shutdown(const QStringList &commandLineFragments) 
{ 
    emit signal_shutdown_request(); 
} 

私はこのトピックに関する記事の束を読んだが、いずれも適用されているように見えるん:EMITラインは `CLICommand :: signal_shutdown_request()」にエラー未定義の参照を生成します。私はクリーン/再構築を試みました。私はブーストや他のライブラリを使用していません...ちょうどQT 5

私が間違っていることを誰かに教えてもらえますか?


解決策:QT Creatorでは、プロジェクトを右クリックし、「QAMKEを実行」を選択してすべてを再構築します。 REBUILD ALLの実行に関する他の投稿は間違っています...それはqmakeを実行しない自分のものです。

答えて

12

これらの変更に対して「moc」が実行されていることを確認する必要があります。生成されたmocファイルが見つからないか、古いもので、現在の状態への適切な参照が含まれていないようです。

Q_OBJECTマクロを追加すると、QtCreatorはqmakeを正しく再実行しません。これは長年にわたる問題であり、手動で再実行する必要があります。良いと簡単な答えで常に

https://bugreports.qt.io/browse/QTCREATORBUG-231

+0

、Qtの創造主を使用している場合、明示的に 'qmake'を再実行するためのおかげで1 –

+0

おそらく最も簡単な方法は、直接ビルドに行き、' Makefile'を削除することです。次に、次の 'すべてビルド'アクションでQt Creatorがそれを再生成し、 'Q_OBJECT'の変更関連リンクエラーがなくなります。 – maxschlepzig

関連する問題