2013-07-02 42 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

可能的重複[Class with virtual function,當從QObject派生時,導致鏈接錯誤](http://stackoverflow.com/questions/7103964/class-with-virtual-function-when-derived-from-qobject -leads-to-linking-error) –

+0

(還有其他幾個重複項) –

+0

@MatsPetersson:很好。與您聯繫的_「解決方案」爲我解決了**沒有任何問題。但是,無論如何,謝謝你,現在我卡住了。此外,我需要** QObject來使用信號。 –

回答

1

您需要包括這條線在源文件的末尾:

#include "MainController.moc"

或者,你也可以用你的編譯系統處理這個問題,但是這可能是前者更容易。

11

在代碼編譯完成後添加Q_OBJECT宏時,必須重新運行qmake。這會將MainController.moc的創建和編譯添加到您的Makefile,從而防止鏈接器錯誤。

+2

謝謝!這在我添加'Q_OBJECT'宏後解決了我的問題。右鍵單擊您的項目,然後單擊**運行qmake **,然後再次嘗試構建。 – mattbell87