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