2017-10-25 1 views
2

に「vtableのために未定義の参照」を解決するために役立っていないコードです:私は手動でビルドディレクトリを削除した何も私はここで</p> <p>「CustomUndoStackためにvtableのために未定義の参照」エラーでこれを構築することはできませんQtの

QT += widgets 

CONFIG += c++14 console 
CONFIG -= app_bundle 

DEFINES += QT_DEPRECATED_WARNINGS 

SOURCES += main.cpp 

、私はすべての可能な方法で「すべてリビルド」「すべてクリーン」しようとしたとき、私は100500回qmakeに実行してきた、私は上CustomUndoStackインターフェイスを変更しました9000回、何も役に立たない。

問題はどこですか?

UPDコメントに答える:私はQ_OBJECT行を削除すると、これを行うことはできません。それはあなたの問題はあなたがクラスのサブクラスQObjectの宣言を持っていると.cppファイル内で内部Q_OBJECTマクロを持つことに起因する「いいえ、そのようなシグナルはQObject :: undoSignal()」

class CustomUndoStack : public QObject 
{ 
// Q_OBJECT 

public: 
    CustomUndoStack() { 
     connect(this, SIGNAL(undo_signal()), &undoStack, SLOT(undo())); 
    } 
signals: 
    void undo_signal(); 
private: 
    QUndoStack undoStack; 
}; 
+0

私はQt 5.9を使用しています – banana36

答えて

4

と言います。そのマクロは、とりわけ、仮想メソッドの宣言を含む:

virtual const QMetaObject *metaObject() const; 

qmakeツールは自動的Q_OBJECTマクロによって生成される宣言に対応する実際のコードを生成するために、マクロQ_OBJECTを含むQObjectサブクラスを検索するヘッダファイルを処理します。あなたのケースでは、qmakemain.cppファイルを処理しないため、実装されていない仮想関数が残っています。つまり、受け取っているリンカエラーです。

適切な解決策は、クラスの宣言を別のヘッダーファイルに移動し、プロジェクトにヘッダーを追加することです。ちょっとハックですが、あなたには、いくつかの理由のために絶対に.cppファイル内のクラスの宣言を残すために必要がある場合は、それを使用することができ、別の解決策は、しかし、あります:

class CustomUndoStack : public QObject 
{ 
    Q_OBJECT 
public: 
    CustomUndoStack(QObject * parent = 0) : QObject(parent) {} 
}; 

#include "main.moc" 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication qCoreApplication(argc, argv); 

    CustomUndoStack uStack; 

    return qCoreApplication.exec(); 
} 

#include "main.moc"行に注目してください。この行があると、qmake.cppファイルの宣言を実際に処理し、Q_OBJECTマクロによって生成された宣言に対応する自動生成コードを含む必要な.mocファイルを生成します。

関連する問題