Модульное тестирование Несогласованная привязка 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 :: UnitTestd1 :: Test (void) "(? 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, то для борьбы с проектом нажмите- ›Свойство-› C / C ++ - ›Препроцессор-› Определения препроцессора, просто добавьте MY_EXPORTS в список - person gomons; 17.04.2015
comment
Это для сборки dll. Не помещайте этот макрос в определения препроцессора при сборке test. - 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. Затем щелкните правой кнопкой мыши Project - ›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 now error is Не удалось настроить контекст выполнения для запуска теста. может быть, я отмечу это как ответ и поставлю для этого новый вопрос. - person O.O; 17.04.2015
comment
Позвольте нам продолжить это обсуждение в чате. - person gomons; 17.04.2015
comment
Я обнаружил эту stackoverflow.com/ questions / 13195151 / - person gomons; 17.04.2015