2013-07-02 25 views
6

私は質問が何回も尋ねられていることを知っていますが、私はここで解決策やGoogleを見つけることができません。QObject:vtableのリンクエラーが表示されません

は、ここに私のヘッダファイル

#ifndef MAINCONTROLLER_H 
#define MAINCONTROLLER_H 

#include <QSettings> 
#include <QDebug> 
#include <QDir> 
#include <QObject> 

#include "PhTools/PhString.h" 
#include "PhStrip/PhStripDoc.h" 

class MainController : public QObject 
{ 
    Q_OBJECT 

public: 
    explicit MainController(QObject *parent = 0); 
    void loadSettings(); 
    PhString getLastFile(); 
    void setLastFile(PhString fileName); 
    bool openDoc(PhString fileName); 

signals: 
    void docChanged(); 

private: 
    QSettings * _settings; 
    PhStripDoc * _doc; 

}; 

#endif // MAINCONTROLLER_H 

そして、私のCPPファイルです:

#include "MainController.h" 


MainController::MainController(QObject *parent) : 
    QObject(parent) 
{ 
    _doc = new PhStripDoc(); 
    loadSettings(); 
} 
void MainController::loadSettings() 
{ 
    _settings = new QSettings(QDir::homePath() + "/Library/Preferences/com.me.me.plist", QSettings::NativeFormat); 

    getLastFile(); 
} 

PhString MainController::getLastFile() 
{ 
    qDebug() << "lastfile :" << _settings->value("last_file", "").toString(); 
    return _settings->value("last_file").toString(); 
} 

bool MainController::openDoc(PhString fileName) 
{ 
    bool succeed = _doc->openDX(fileName); 
    if (succeed) 
     emit docChanged(); 
    return succeed; 
} 

void MainController::setLastFile(PhString filename) 
{ 
    _settings->setValue("last_file", filename); 
} 

そして、ここでエラーログです:

Undefined symbols for architecture x86_64: 
    "MainController::docChanged()", referenced from: 
     MainController::openDoc(QString) in MainController.o 
    "vtable for MainController", referenced from: 
     MainController::MainController(QObject*) in MainController.o 
     MainController::MainController(QObject*) in MainController.o 
    NOTE: a missing vtable usually means the first non-inline virtual member function has no definition. 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

それはsignalsから来るかもしれないが、私はありませんよ確かに...

+0

[仮想関数を持つクラス、QObjectから派生した場合、リンクエラーにつながる](http://stackoverflow.com/questions/7103964/class-with-virtual-function-when-derived-from-qobject -leads-to-linking-error) –

+0

(他にも重複があります) –

+0

@MatsPetersson:Nice。リンクした_ "solution" _は私のために** nothing **を解決します。とにかくありがとう、今私は立ち往生しています。さらに、信号を使うには** QObjectが必要です。 –

答えて

1

あなたのソースファイルの末尾に次の行を含める必要があります。

また

#include "MainController.moc"

、また、あなたのビルドシステムでこれを扱うことができますが、それはおそらく簡単です元です。

11

コードが既にコンパイルされた後にQ_OBJECTマクロが追加されると、qmakeを再度実行する必要があります。これにより、MainController.mocの作成とコンパイルがMakefileに追加され、リンカエラーを防止します。

+2

ありがとう!これは 'Q_OBJECT'マクロを追加した後の私の問題を修正しました。あなたのプロジェクトを右クリックし、** Run qmake **をクリックして、もう一度ビルドを試してみてください。 – mattbell87

関連する問題