Как написать файл qmake для тестового примера?

Я просто не понимаю, какова общая схема проекта Qt с программой и тестом...

В проекте учебника QTest есть только тестовая программа, но в моем проекте уже есть другая программа. Если я добавлю тестовый пример, он утверждает «множественное определение main()», поскольку QTEST_MAIN на самом деле является другим main().

Кроме того, я получил «неопределенную ссылку на vtable» в своем тестовом классе и не знаю, почему.

Я использую Qt 5.2.1

Это мой файл проекта:

#-------------------------------------------------
#
# Project created by QtCreator 2014-06-06T13:42:19
#
#-------------------------------------------------

QT       += core gui testlib
CONFIG += testcase

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = GutMiner
TEMPLATE = app
LIBS += -lquazip


SOURCES += main.cpp\
        mainwindow.cpp \
    dataform.cpp \
    datavec.cpp \
    distance.cpp \
    linereader.cpp \
    diseasepackage.cpp \
    error.cpp \
    newpagedialog.cpp \
    resultpage.cpp \
    test.cpp

HEADERS  += mainwindow.h \
    dataform.h \
    distance.h \
    datavec.h \
    linereader.h \
    diseasepackage.h \
    error.h \
    newpagedialog.h \
    resultpage.h

FORMS    += mainwindow.ui \
    dataform.ui \
    newpagedialog.ui

и это мой тестовый исходный файл:

#include <QObject>
#include <QTest>

#include "distance.h"
#include "diseasepackage.h"

class TestDistance: public QObject
{
    Q_OBJECT
public:
    virtual ~TestDistance();
private slots:
    void jensen_shannon();
};

TestDistance::~TestDistance() {}

void TestDistance::jensen_shannon()
{
    DiseasePackage pkg("CRC.zip");
}

QTEST_MAIN(TestDistance);

person jiandingzhe    schedule 11.06.2014    source источник
comment
Возможно, вам поможет мой ответ здесь.   -  person Andrey Rogozhnikov    schedule 11.06.2014
comment
Если это так, то это дубликат.   -  person Andrey Rogozhnikov    schedule 11.06.2014


Ответы (1)


Один из способов заставить это работать должным образом (тот, который я использую с Qt 4.8) состоит в том, чтобы иметь отдельный файл .pro для тестовой программы.

Файл .pro основной программы НЕ содержит тестовый код.

QT       += core gui qt3support xml script

TARGET = simui
TEMPLATE = app

SOURCES += main.cpp\
    <lots of other source files

HEADERS  += \
    < header files>

FORMS    += \
    < form files > 

Файл .pro тестовой программы НЕ содержит main.cpp. Файл .pro тестовых программ включает в себя тестовую библиотеку:

QT      += core gui qt3support xml script
CONFIG  += qtestlib

TARGET = testsimui
TEMPLATE = app

SOURCES += \
    < all the sources form the main program (except main.cpp!) > 
    < all the test code sources. >

HEADERS += \
    < all the headers from the main program >
    < all the test code headers> 

FORMS    += \
    < all the forms from the main program > 

Это не обязательно лучшая настройка, но она работает хорошо, хотя в конечном итоге вам придется добавлять каждый исходный файл в оба файла .pro.

Что касается вашей проблемы с vtable, я не думаю, что в том, что вы дали, достаточно информации, чтобы что-то из этого сделать. В каком классе проблема? Кроме того, мне любопытно, почему у вас есть пустой деструктор в вашем тестовом классе.

person Michael Kohne    schedule 13.06.2014
comment
Проблема с vtable вызвана тем, что проект не выполнял предварительную обработку файлов .cpp с помощью mro. Так что есть нереализованные методы, которые должны быть в сгенерированных mro исходниках. - person jiandingzhe; 16.06.2014