2013-08-06 11 views
0

단위 테스트를 시도하고 있지만 작동하지 않습니다.C++ QT5 LNK 2019 미확인 외부 기호 (단위 테스트)

2 개의 .pro 파일이 있습니다. 내 "메인"프로젝트에 하나, "Unittest"에 하나.

내 폴더 구조는 다음과 같습니다

offline_ip_adress_calculator 
├───updater 
│ └───updater 
├───classes 
│ ├───ip_calculator 
│ └───threads 
├───image 
└───tests 
    └───Unittest 
     └───ip_calculator 

유닛 테스트 .PRO 파일 :

TargetDirectory = C:\build\unit_test 

CONFIG(debug, debug|release) { 
    DESTDIR = $$TargetDirectory\debug 
    OBJECTS_DIR = $$TargetDirectory\debug\.obj 
    MOC_DIR = $$TargetDirectory\debug\.moc 
    RCC_DIR = $$TargetDirectory\debug\.rcc 
    UI_DIR = $$TargetDirectory\debug\.ui 
} else { 
    DESTDIR = $$TargetDirectory\release 
    OBJECTS_DIR = $$TargetDirectory\release\.obj 
    MOC_DIR = $$TargetDirectory\release\.moc 
    RCC_DIR = $$TargetDirectory\release\.rcc 
    UI_DIR = $$TargetDirectory\release\.ui 
} 

QT += testlib 
QT += core 


INSTALLS += target sources 

CONFIG += c++11 


TARGET = maintest 

# Change this Path 
INCLUDEPATH += X:/ip_adress_calculator/offline_ip_adress_calculator 

TEMPLATE = app 

SOURCES += \ 
    qtestqstring.cpp \ 
    ip_calculator/qttestcomboxone.cpp \ 
    main.cpp 

HEADERS += \ 
    qtestqstring.h \ 
    ip_calculator/qttestcomboxone.h 

내 단위 테스트 클래스 :

#ifndef QTTESTCOMBOXONE_H 
#define QTTESTCOMBOXONE_H 

#include <QObject> 
#include <QtTest/QTest> 


#include "classes/ip_calculator/comboxone.h" 

class QtTestComboxOne : public QObject 
{ 
    Q_OBJECT 

private slots: 
    void QtTestCalculateIndustrialSwitchOne(); 

public: 
    explicit QtTestComboxOne(QObject *parent = 0); 

signals: 

public slots: 

}; 

#endif // QTTESTCOMBOXONE_H 


#include "qttestcomboxone.h" 

QtTestComboxOne::QtTestComboxOne(QObject *parent) : 
    QObject(parent) 
{ 
} 




void QtTestComboxOne::QtTestCalculateIndustrialSwitchOne() 
{ 
    ComboxOne combox_one; 

    combox_one.setCommunicationNumber(1); 
    QCOMPARE(combox_one.calculate(QString("industrial_switch_1")), QString("10.0.20.2")); 
} 

ComboxOne 클래스 :

#ifndef COMBOXONE_H 
#define COMBOXONE_H 

#include "abstractipcalculator.h" 

class ComboxOne : public AbstractIpCalculator 
{ 
public: 
    ComboxOne(); 
    QString calculate(QString); 

private: 
    QString calculateOctetOne(QString); 
    QString calculateOctetTwo(QString); 
    QString calculateOctetThree(QString); 
    QString calculateOctetFour(QString); 
}; 

#endif // COMBOXONE_H 

COmboxOne의 CPP :

#include "comboxone.h" 

ComboxOne::ComboxOne() 
{ 
    data_structure.enqueue(QPair<QString, QString>("industrial_switch_1", "Industrial Switch I")); 
} 

QString ComboxOne::calculate(QString name) 
{ 
    QString return_value; 

    return_value.append(calculateOctetOne(name)); 
    return_value.append("."); 
    return_value.append(calculateOctetTwo(name)); 
    return_value.append("."); 
    return_value.append(calculateOctetThree(name)); 
    return_value.append("."); 
    return_value.append(calculateOctetFour(name)); 

    return return_value; 
} 

QString ComboxOne::calculateOctetOne(QString name) 
{ 
    return [...]; 
} 

QString ComboxOne::calculateOctetTwo(QString name) 
{ 
    [...] 
    return QString::number(temp_res); 
} 

QString ComboxOne::calculateOctetThree(QString name) 
{ 
    [...] 
    return QString::number(temp_res); 
} 

QString ComboxOne::calculateOctetFour(QString name) 
{ 
    [...] 
    return QString("10"); 

} 

AbstractIpCalculator

#ifndef ABSTRACTIPCALCULATOR_H 
#define ABSTRACTIPCALCULATOR_H 

#include <QString> 
#include <QDebug> 
#include <QPair> 
#include <QQueue> 


class AbstractIpCalculator 
{ 
public: 
    QQueue<QPair<QString,QString> > data_structure; 

    AbstractIpCalculator(); 

    bool setParkNetzId(int index, int value); 
    void setCommunicationNumber(int communication_number); 
    virtual QString calculate(QString) = 0; 

protected: 
    QMap<int, int> park_netz_list; 
    int communication_number; 
    int getParkNetId(); 

    static const int bla_1 = 360; 
    static const int bal_2 = 363; 

private: 
    virtual QString calculateOctetOne(QString) = 0; 
    virtual QString calculateOctetTwo(QString) = 0; 
    virtual QString calculateOctetThree(QString) = 0; 
    virtual QString calculateOctetFour(QString) = 0; 
}; 

#endif // ABSTRACTIPCALCULATOR_H 

단위 테스트 홈페이지

#include <QTest> 
#include "qtestqstring.h" 
#include "ip_calculator/qttestcomboxone.h" 

int main() 
{ 
    QTestQString string_test; 
    QtTestComboxOne combox_one; 

    QTest::qExec(&string_test); 
    QTest::qExec(&combox_one); 
} 

내가 얻을이 오류 메시지 :

qttestcomboxone.obj:-1: Fehler:LNK2019: unresolved external symbol "public: virtual class QString __thiscall ComboxOne::calculate(class QString)" ([email protected]@@[email protected]@[email protected]@Z) referenced in function "private: void __thiscall QtTestComboxOne::QtTestCalculateIndustrialSwitchOne(void)" ([email protected]@@AAEXXZ) 

qttestcomboxone.obj:-1: Fehler:LNK2019: unresolved external symbol "public: void __thiscall AbstractIpCalculator::setCommunicationNumber(int)" ([email protected]@@[email protected]) referenced in function "private: void __thiscall QtTestComboxOne::QtTestCalculateIndustrialSwitchOne(void)" ([email protected]@@AAEXXZ) 

qttestcomboxone.obj:-1: Fehler:LNK2019: unresolved external symbol "public: bool __thiscall AbstractIpCalculator::setParkNetzId(int,int)" ([email protected]@@[email protected]) referenced in function "private: void __thiscall QtTestComboxOne::QtTestCalculateIndustrialSwitchOne(void)" ([email protected]@@AAEXXZ) 

나는 생각한다 "ComboxOne"클래스는 부모 클래스를 찾을 수 없습니다.

+0

실제로 코드를 작성한 적이 있습니까? 'AbstractIpCalculator'는 파생 클래스에서 구현되어야하는 메소드에 대해'= 0'이 누락 된 것처럼 들리지만,'calculate','setCommunicationNumber' 및'setParkNetzId'입니다. –

+0

예, setCommunicationNumber와 setParkNetzId에 대한 코드는 wirtten입니다 AbstractIpCalculator에서. 계산은 가상 QString입니다. (QString) = 0; AbstractIpCalculator에 정의되어 있습니다. 이 클래스를 사용했지만 유닛 테스트에서 사용할 수 없으며 단서가 없습니다. – user2357505

+0

함수가 정의 된 구현 파일을 잊어 버린 것 같습니다. –

답변

0

이 문제는 ComboxOne.cppSOURCES에 나열되지 않아서 발생합니다. 프로젝트 파일은 기본적으로 메이크 파일이며 빌드의 연결 단계는 SOURCES을 기반으로하므로 필요한 소스 파일이 없으면 링커에서 기호를 찾지 못합니다.