2

重複の可能性:
vtableへの未定義の参照。Qtプロジェクトをコンパイルしようとしています

これがコードです

#include <iostream>
#include <QApplication>
#include <QTimer>


class myClass : public QObject {
    Q_OBJECT

public:
    QTimer *timer;
    myClass(){
        timer = new QTimer(this);
        connect(timer, SIGNAL(timeout()), this, SLOT(mySlot()));
        timer->start(1000);
    }
public slots:
    void mySlot() {
        std::cout << "Fire" << std::endl;
    }
};

int main() {
    std::cout << "Hello, world";
    myClass atimer;
    return 0;
}

エラーとは別に、私が理解していないことが2つあります。

  1. マクロの後にセミコロンがないのはなぜですか。この場合はQ_OBJECTです。C ++構文に準拠していないようですが、それでも人々はそのようなコードを記述します。

  2. 「パブリックスロット」はQtによって作成された修飾子ですが、どうしてgccコンパイラはそれを理解できるのでしょうか。QtのようなIDEは、言語の標準構文をどのように変更できますか?

4

5 に答える 5

3

正確なエラーメッセージは表示mocされませんでしたが、コードを実行しなかったか、mocによって生成されたコードをコンパイルしなかったか、コードを実行可能ファイルにリンクしなかったことが原因であると思われます。図書館。

あなたの他の質問に関して:

  1. マクロの後にセミコロンを付ける必要はありません。プリプロセッサはセミコロンを気にしません-コンパイラだけが気にします。したがって、セミコロンを手動で追加する必要があるかどうかはQ_OBJECT、この場合のマクロ()の展開先と、それを使用する場所によって異なります。あなたの場合、セミコロンは必要ありません。

  2. slotsは空の文字列に展開されるマクロであるため、C++コンパイルで処理できます。ただし、slotsによって特別なキーワードとしても認識されmocます。ちなみに、同じことがsignals言えます(これはに展開されるマクロprotected:です)。

于 2013-01-11T09:50:30.287 に答える
3

これは、あなたが年をとってから走らなかったqmakeからですQ_OBJECT。qmakeを実行し(QtCreatorを使用する場合は、ビルドメニューにある必要があります)、コンパイルします;)。

お役に立てば幸いです

于 2013-01-11T10:44:58.433 に答える
0

通常、への未定義の参照vtableは、いくつかの仮想関数を宣言したことを示しますが、それらに定義を提供することはありません。おそらくQ_OBJECT何かを宣言していますか?

マクロは、 C ++構文が考慮される前に展開され、テキスト形式で機能します。これが、マクロ自体がC++構文に従う必要がない理由です。たとえば、Q_OBJECT定義の最後にセミコロンが含まれている場合、置換後に正しいC ++コードを取得できれば、それで十分です。

slotsマクロの場合もあります(空の場合もあります)。次に、何も置き換えなかった後slots、有効なC++コードを再度取得します。

于 2013-01-11T09:51:00.567 に答える
0

QTが提供するメタオブジェクトコンパイラを使用する必要があります

于 2013-01-11T10:28:37.737 に答える
0

一般に、vtableエラーへの未定義の参照が発生する場合は、qmakeが実行されておらず、それに必要なものが生成されていないことが原因mocです。プロジェクトディレクトリでqmakeを再実行すると修正されるはずですが、それでもビルドがクリーンアップされない場合は、quakeを実行してもう一度makeを実行してください。

于 2013-01-11T10:38:53.000 に答える