Тестване на единици. Непоследователното свързване на dll води до грешка при компилиране

Нов в c++ и се опитва да тества dll, но продължава да получава

warning C4273: 'CRootFinder::SquareRoot' : inconsistent dll linkage 

RootFinder.h

#ifdef MY_EXPORTS
#define API _declspec(dllexport)
#else
#define API _declspec(dllimport)
#endif

class API CRootFinder {
public:
    CRootFinder(void);
    double SquareRoot(double v);
};

RootFinder.cpp

#include "stdafx.h"
#include "RootFinder.h"

double CRootFinder::SquareRoot(double v)
{
    return 0.0;
}

Изгражда, но получава предупреждение по-горе.

Добавена е препратка към dll към проект за тестване на единица

unittest1.cpp

#include "stdafx.h"
#include "CppUnitTest.h"
#include "../c source/RootFinder.h"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;

namespace Tests
{       
    TEST_CLASS(UnitTest1)
    {
    public:

        TEST_METHOD(TestMethod1)
        {
            CRootFinder rooter;
            Assert::AreEqual(
                // Expected value:
                0.0,
                // Actual value:
                rooter.SquareRoot(0.0),
                // Tolerance:
                0.01,
                // Message:
                L"Basic test failed",
                // Line number - used if there is no PDB file:
                LINE_INFO());
        }

    };
}

Няма да строи

Грешка 2 грешка LNK2019: неразрешен външен символ "__declspec(dllimport) public: __thiscall CRootFinder::CRootFinder(void)" (__imp_??0CRootFinder@@QAE@XZ), посочен във функция "public: void __thiscall Tests::UnitTest1::TestMethod1 (невалиден)" (?TestMethod1@UnitTest1@Tests@@QAEXXZ)


person O.O    schedule 16.04.2015    source източник
comment
Няма смисъл да се използват две DLL файлове тук, C++/CLI компилаторът е напълно способен да свърже управлявания тестов код .objs и тествания собствен код .objs в един DLL.   -  person Ben Voigt    schedule 17.04.2015


Отговори (1)


Компилирайте dll с MY_EXPORTS препроцесор marco. Добавете го използвайте в тест без дефиниционен макрос MY_EXPORTS.

Във Visual Studio можете да направите това: Project right click->Propertis->C/C++->Preprocessor->Preprocessor Definitions, просто добавете MY_EXPORTS към списъка за dll проект и оставете този списък без MY_EXPORTS за тестов проект.

И трябва да дефинирате конструктор CRootFinder() в RootFinder.cpp.

person gomons    schedule 16.04.2015
comment
Това е необходимо само за изграждане на dll и определено не за приложението, което използва dll. - person drescherjm; 17.04.2015
comment
@drescherjm, моя грешка, изглежда, че я поправих (= - person gomons; 17.04.2015
comment
@gomons - съжалявам, къде да направя това? Мислех, че правя това, което каза. - person O.O; 17.04.2015
comment
Ако използвате Visual Studio, след това Project борете щракнете-›Propertis-›C/C++-›Preprocessor-›Preprocessor Definitions, просто добавете MY_EXPORTS към списъка - person gomons; 17.04.2015
comment
Той е за изграждане на dll. Не поставяйте този макрос в дефинициите на препроцесора, когато създавате тест. - person gomons; 17.04.2015
comment
@gomons - Добре. Това разреши предупреждението, но грешката при изграждането все още е там. Не дефинирах MY_EXPORTS в теста. - person O.O; 17.04.2015
comment
Предупреждение от линкер. Изглежда, че не добавяте .lib файл към вашия тестов проект. - person gomons; 17.04.2015
comment
Щракнете с десния бутон върху проекта-›Propertis-›Linker-›Additional Library Directory, добавете към списъка път към папката, където е .lib файлът на вашата dll. След това щракнете с десния бутон върху проекта-›Propertis-›Linker-›Input-›Additional Dependencies, добавете към списъка .lib файл - person gomons; 17.04.2015
comment
Премахнах препратка към dll от тестов проект и я добавих отново, но все още имам тази грешка. ? - person O.O; 17.04.2015
comment
Хм... ако добавиш dll към справка, става същото, което описах по-горе... Трябва ми време за размисъл - person gomons; 17.04.2015
comment
Ха, опитвате се да компилирате клас в dll, но не можете да направите това - person gomons; 17.04.2015
comment
Не можете да експортирате клас, вместо това трябва да експортирате всеки метод от вашия клас. - person gomons; 17.04.2015
comment
хм :) не бързай :) - person O.O; 17.04.2015
comment
Намерих. Забравихте да дефинирате конструктора - person gomons; 17.04.2015
comment
О да. Ето защо. buuut сега грешка е Неуспешно настройване на контекста на изпълнение за изпълнение на теста. може би ще маркирам това като отговор и ще направя нов въпрос за него. - person O.O; 17.04.2015
comment
Нека продължим тази дискусия в чата. - person gomons; 17.04.2015
comment
Намерих този stackoverflow.com/ въпроси/13195151/ - person gomons; 17.04.2015