2017-01-25 5 views
1

Мне нужно захватить излучаемые сигналы из QProcess для целей тестирования.qt - неопределенная ссылка на `vtable for myObj 'в приложении консоли qt - сигналы и слоты

Поскольку я использую консольное приложение, я решил создать класс в моем файле main.cpp под названием myObj, используя в основном this example:

#include <QCoreApplication> 
#include <QLoggingCategory> 
#include <QTextStream> 
#include <QProcess> 
#include <QString> 
#include <QVariant> 
#include <QDebug> 
#include <QObject> 

class myObj : public QObject 
{ 

    Q_OBJECT 

public: 
    myObj(QObject *parent = 0); 
// virtual ~Communicate(); 
    ~myObj(); 

public slots: 
    void registerFinished(int signal); 
    void registerAboutToClose(); 
    void registerChannelReadyRead(int signal); 
    void registerReadChannelFinished(); 
    void registerReadyRead(); 
    void registerReadyReadStandardOutput(); 
    void registerStarted(); 
}; 

myObj::myObj(QObject *parent) 
    : QObject(parent)    <--- LINE 72 Error 
{ 

} 

//virtual myObj::~Communicate(){ 

//} 

myObj::~myObj(){     <--- LINE 81 Error 

} 

void myObj::registerFinished(int signal){ 
    qDebug() << "exit code = " << QString::number(signal); 
} 
void myObj::registerAboutToClose(){ 
    qDebug() << "aboutToClose"; 
} 
void myObj::registerChannelReadyRead(int signal){ 
    qDebug() << "channelReadyRead = " << QString::number(signal); 
} 
void myObj::registerReadChannelFinished(){ 
    qDebug() << "readChannelFinished"; 
} 
void myObj::registerReadyRead(){ 
    qDebug() << "exit code"; 
} 
void myObj::registerReadyReadStandardOutput(){ 
    qDebug() << "exit code"; 
} 
void myObj::registerStarted(){ 
    qDebug() << "started"; 
} 

myObj *myO; 

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

    myO = new myObj(); 

    //.... 
} 

Проблема:

main.cpp:72: error: undefined reference to `vtable for myObj'

main.cpp:81: error: undefined reference to `vtable for myObj'

У меня есть просмотрел ряд SO-страниц, например here и here и here и другие, еще не нашел решение

Я попытался/сделали:

  • добавлен макрос Q_OBJECT
  • побежал QMAKE
  • перестроен
  • проверил #include

.pro файл

QT += core 
QT -= gui 

CONFIG += c++11 

TARGET = serv_app 
CONFIG += console 
CONFIG -= app_bundle 

TEMPLATE = app 

SOURCES += main.cpp 

Любые предложения?

+0

Смотрите, если это полезно: http://stackoverflow.com/questions/3065154/undefined-reference-to-vtable –

+0

удалить Q_OBJECT – eyllanesc

+0

@eyllanesc удаления Q_OBJECT Макрос удалит способность класса, чтобы использовать функции, такие как сигналы и слоты -> http://doc.qt.io/qt-4.8/signalsandslots.html – KGCybeX

ответ

3

У вас есть два варианта:

  • решение @eyllanesc работает точно.
  • добавить строку #include "main.moc" до или после вас main() функция.

Когда вы помещаете класс в свой заголовочный файл, qmake сгенерирует правильный файл moc.

Но когда вы помещаете класс в файл .cpp, код moc не генерируется, если вы не поместили строку, о которой я говорил ранее.

Update # 1

В Qt tutorial about writing a Unit Test можно найти следующую информацию:

Note that if both the declaration and the implementation of our test class are in a .cpp file, we also need to include the generated moc file to make Qt's introspection work.

Так что это еще один пример, где мы должны включить файл moc.

+0

должен был поместить '#include 'main.moc" 'чуть выше основного метода, также не был найден« main.moc »при первом размещении. После строительства это сообщение ушло. – KGCybeX

+0

Да. Вам нужно очистить каталог сборки или повторно запустить qmake. – Tarod

+0

В моем профиле у вас есть ссылка на мою домашнюю страницу. Свяжитесь со мной. Но я думаю, что это также хорошая идея, чтобы опубликовать вопрос в SO. – Tarod