Unresolved externals при компиляции модульных тестов для Visual С++ 2012

Я хочу создать модульные тесты для проекта Visual С++. Я пробовал следовать этим инструкциям MSDN. Я нашел страницы, где они различают неуправляемый/смешанный/чистый код, но я не совсем понимаю эти понятия. Мой код не использует .NET и, скорее всего, скомпилируется под MinGW с несколькими настройками кода.

Мой главный проект создает исполняемый файл, поэтому я выполнил действия, указанные в разделе "Ссылка на экспортированные функции из тестового проекта". Для начала я получил разные варианты проекта:

Я пошел с Native Unit Test Project. Я добавил ссылку на мой основной проект, и я установил Include Directoryories в $(SolutionDir)\Cubes;$(IncludePath). Я написал свой код и получил это при компиляции:

1>Creating library C:\Users\Pieter\Dropbox\Unief\TTUI\TTUIproject\Cubes\Debug\CubesTest.lib and object C:\Users\Pieter\Dropbox\Unief\TTUI\TTUIproject\Cubes\Debug\CubesTest.exp
1>LayoutTest.obj : error LNK2019: unresolved external symbol "public: __thiscall Room::Room(void)" ([email protected]@[email protected]) referenced in function "public: void __thiscall CubesTest::LayoutTest::NumOfRoomsConsistency(void)" ([email protected]@[email protected]@QAEXXZ)
1>LayoutTest.obj : error LNK2019: unresolved external symbol "public: __thiscall Layout::Layout(class Room *,int)" ([email protected]@[email protected]@@[email protected]) referenced in function "public: void __thiscall CubesTest::LayoutTest::NumOfRoomsConsistency(void)" ([email protected]@[email protected]@QAEXXZ)
1>LayoutTest.obj : error LNK2019: unresolved external symbol "public: void __thiscall Layout::add(int,int,class Room *)" ([email protected]@@[email protected]@@Z) referenced in function "public: void __thiscall CubesTest::LayoutTest::NumOfRoomsConsistency(void)" ([email protected]@[email protected]@QAEXXZ)
1>LayoutTest.obj : error LNK2019: unresolved external symbol "public: void __thiscall Layout::clear(int,int,bool)" ([email protected]@@[email protected]) referenced in function [email protected]@[email protected]@QAEXXZ$0
1>C:\Users\Pieter\Dropbox\Unief\TTUI\TTUIproject\Cubes\Debug\CubesTest.dll : fatal error LNK1120: 4 unresolved externals

Если я не ошибаюсь, это означает, что компилятор находит файлы заголовков, но не исходные файлы. Что мне не хватает?

Ответы

Ответ 1

Ниже приведено пошаговое описание того, как добавить EXE в качестве целевой единицы измерения.

Ключевым моментом является "экспорт" функций/классов, которые вы хотите проверить... Вы можете загрузить полный образец здесь: http://blog.kalmbachnet.de/files/CPP_UnitTestApp.zip (я не изменял никаких параметров проекта, поэтому все изменения вы можете видеть в исходном коде, конечно, некоторые части могут быть сделаны в настройках проекта).

  • Создайте приложение Win32 (консоль или MFC или Windows, не имеет значения); Я создал консольный проект под названием CPP_UnitTestApp:

  • Добавьте функцию, которую вы хотите протестировать (вы также можете добавить классы). Например:

    int Plus1(int i)
    {
      return i+1;
    }
    
  • Добавить файл заголовка для функций, которые вы хотите проверить: CPP_UnitTestApp.h

  • Поместите объявление методов в файл заголовка, а также экспортируйте эти функции!

    #pragma once
    
    #ifdef EXPORT_TEST_FUNCTIONS
    
    #define MY_CPP_UNITTESTAPP_EXPORT __declspec(dllexport)
    #else
    #define MY_CPP_UNITTESTAPP_EXPORT
    #endif
    
    MY_CPP_UNITTESTAPP_EXPORT int Plus1(int i);
    
  • Включите этот заголовочный файл в main-cpp (здесь CPP_UnitTestApp.cpp) и определите EXPORT_TEST_FUNCTIONS перед включением заголовка:

    #define EXPORT_TEST_FUNCTIONS
    #include "CPP_UnitTestApp.h"
    
  • Теперь добавьте новый проект (Native unit test project: UnitTest1)

  • Включите заголовок и lib в файл "unittest1.cpp" (примите нужные пути):

    #include "..\CPP_UnitTestApp.h"
    #pragma comment(lib, "../Debug/CPP_UnitTestApp.lib")
    
  • Перейдите к настройкам проекта тестового проекта, добавьте ссылку на проект "UnitTest1" (Project | Properties | Common Properties | Добавить новую ссылку...: выберите в разделе "Проекты" "CPP_UnitTestApp" - Проект)

  • Создайте функцию unit test:

    TEST_METHOD(TestMethod1)
    {
      int res = Plus1(12);
      Assert::AreEqual(13, res);
    }
    
  • Запустите unit test;)

Как вы можете видеть, основной задачей было экспортировать объявление функции! Это делается через __declspec(dllexport), даже если это EXE.

Как я уже сказал, демонстрационный проект можно скачать здесь: http://blog.kalmbachnet.de/files/CPP_UnitTestApp.zip