2011-02-01 10 views
1

私はこれに関するFAQや他のいくつかのウェブサイトを読んだが、適切な解決策を見つけることができない。私はあなたが前にこの質問を聞いたと確信しています。可能ならば、どうすればこの問題を解決すべきかについて具体的な助けを求めたいと思います。「vtableへの未定義参照」エラーを正しく解決する方法はありますか?

特定のエラーは、次のとおりです。 エラー:FGui」のvtableの `への未定義参照 それは常にfgui.cppにコンストラクタを指しますが、私はそれで間違っている可能性が何も表示されません。

FGuiは、QMainWindowから継承された "FFoo"という名前のクラスから継承したクラスです。 関連するコード:

(ffoo.hで:)

class Ffoo : public QMainWindow 
{ 
Q_OBJECT 
public: 
    Ffoo(); 
    ~Ffoo(); 
    (...) 
}; 

(ffoo.cppで:)

Ffoo::Ffoo() 
{ 
    textEdit = 0; 
    tcpSock = 0; 
    setupConnectBox(); 
} 

Ffoo::~Ffoo() 
{} 

私だけ作り始めて以来FGuiファイルは、まだ非常に平野です最近のクラス。

(fgui.h :)

class FGui : public Ffoo 
{ 
    Q_OBJECT 
public: 
    FGui(); 
    ~FGui(); 
}; 

(fgui.cpp :)

FGui::FGui() : Ffoo() 
{} 

FGui::~FGui() 
{} 

誰もが、私は非常に感謝される、これを解決するために何をすべきかを私に伝えることができます。前もって感謝します。 :)

+1

おそらく問題はコンストラクタとは関係ありません。コンストラクタはオブジェクトをvtableにリンクする必要があります。他のコードに問題がある可能性があります。あなたのコンストラクタにも問題はありません。 –

答えて

3

あなたのFGuiクラスとFfooクラスはmocにする必要があります。

+0

ええ、おそらくそれは問題です –

+2

ああ、2つの段階的なコンパイルの喜び...私はQTについて嫌いな唯一のことです。 – AJG85

+0

* cmake *は本当に助けになります... – tibur

5

qmakeを再実行してください。 Qt Creatorを使用している場合は、プロジェクトをクリーンアップ(Build/Clean All)してからBuild/Run qmakeを選択してください。このような状況では、これはしばしば役に立ちます。

2

vtableへの未定義参照は、純粋仮想メソッドを実装していないことを意味します。これは、Ffuの純粋な仮想メソッドであり、FGuiで実装するのを忘れた場合や、信号を使用している場合は、メタオブジェクトコンパイラ(不足しているメソッドを実装する)を使用していない可能性があります。

3

ソースファイルに対してrun mocを実行する必要があります。これは、あなたの.proファイルに.cppと.hファイルが含まれている限り、makeを使用してメークファイルを作成した場合、自動的に発生します。これらの手順の1つを忘れているかもしれません。最後にqmakeを実行しているときにクラスにQ_OBJECTマクロが含まれていない場合、単にmakeを実行してもmocが実行されないことに注意してください。あなたはを再度実行する必要がありますので、を実行してください!

"make"を実行すると、.cppファイルがコンパイルされるだけでなく、追加の.cppファイルもmoc(メタオブジェクトコンパイラ)によって作成され、コンパイルされます。この2番目の.cppファイルには、シグナルの実装が含まれています。信号は、通話を接続されたスロット(または信号)に「転送」する通常の方法です。この実装は、(他のものの中でも)mocが生成するものです。あなたのクラスにシグナルが含まれていなくても、クラスは内部的に使用される(?)仮想関数のためにvtableを持つ必要があります...しかし、ソースファイルにQObjectベースのクラスが含まれている場合、mocを実行する必要があります。

+0

ありがとう、これは非常に便利です。私の現在のプロジェクトはCMakeのものなので、これをどうやって行うのか分かりません。 .txtファイルでは、他のcppファイルのリストにfgui.cppを追加しましたが、問題を解決していないようです。 ソースファイルにどのように正確にmocを実行しますか? もう一度、ありがとうございます。 – Neko

+0

cmakeを使うと、cmakeを実行するよりも多くのステップを実行する必要があるようですが、説明できません。問題がこのように解決されるかどうかを手動で調べることをお勧めします。それから私が見つけたこのページを見てください:[Qt4 with cmake](http://qtnode.net/wiki/Qt4_with_cmake#adding.2Fremoving_files) 私はこれが助けてくれることを願っています! – leemes

+0

このページもご覧ください:http://developer.qt.nokia.com/quarterly/view/using_cmake_to_build_qt_projects – leemes

2

通常、ソースファイルの開発の後半にQ_OBJECTマクロを追加すると、これが表示されます。Makefileはあなたがファイルをmocしなければならないとはまだ考えていないので、そうではありません。そして、あなたはこれらのvtableエラーを受け取ります。他の人が指摘しているように、qmakeを再実行してください。クリエイターを使用している場合は、[ビルド]メニューの下にあります。

関連する問題