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