Поэтому я использую UnitTest ++ (версия 1.4)компоновщика ошибки при попытке связать код в тестах с использованием UnitTest ++
Я попытался сделать несколько холостых испытаний (CHECK (правда) и проверить (ложь), и .. те, прекрасно работают, однако, как только я пытаюсь включить некоторые производственный код, компоновщик сходит с ума по сравнению с использованием какого-либо класса или функции из заголовков, которые я включил для тестирования
Мои вопросы:
- Это может быть вызвано чем-либо в UnitTest ++?
- Как настроить мой код или проект в Code :: Blocks, чтобы эта ошибка исчезла?
Детали:
Я использовал модульное тестирование, прежде чем с Java и C#, но я никогда раньше не использовал C++ блок на основе пакета тестирования. Я использую Code :: Blocks 12.11 в качестве моей IDE и GCC 4.6.2 в качестве компилятора для выполнения своей работы.
Я распаковал UnitTest ++ в папку моих инструментов и скомпилировал его, как описано в уроке, в http://wiki.codeblocks.org/index.php?title=UnitTesting и успешно создал файл библиотеки. Я добавил местоположение файла библиотеки в настройки каталога поиска компоновщика в файле настроек тестовых проектов.
Код под тестированием компилируется в собственном проекте, но не при вызове из тестов.
Я настроил свой проект так, чтобы каждый класс тестировался в собственном тестовом файле. У меня есть main.cpp, чтобы связать все тесты вместе.
#include UnitTest++.h
int main(int, char const *[])
{
return UnitTest::RunAllTests();
}
Один класс, который я пытаюсь проверить это CameraLeaf:
#include SceneManagement\CameraLeaf.h
#include Camera.hpp
#include UnitTest++.h
using namespace SceneManagement;
TEST(TestCameraLeafInitialisation)
{
Camera * cam = new Camera();
CameraLeaf * camLeaf = new CameraLeaf(1, 800, 600, 90.0f, cam);
CHECK(camLeaf->getType() == 1);
}
(я использую каталог поиска включает в себя использование угловые скобки, но не будет правильно отображаться на SO)
результаты в:
-------------- Build: Release in Scene Graphs Tests (compiler: GNU GCC Compiler)--------------- mingw32-g++.exe -std=c++0x -Wall -fexceptions -O2 -march=core2 -I"C:\tools\Catch\Catch-0.7(may 2013)\include" -IC:\tools\UnitTest++\src -IC:\Projects\Scene_Graphs -c C:\Projects\Scene_Graphs\tests\unit\CameraLeafTestSuite.cpp -o obj\Release\unit\CameraLeafTestSuite.o mingw32-g++.exe -o "bin\Release\Scene Graphs Tests.exe" obj\Release\unit\CameraLeafTestSuite.o obj\Release\unit\TimeTestSuite.o "obj\Release\Scene Graphs Tests\main.o" -s C:\tools\UnitTest++\Deliv\Release\libUnitTest++.a obj\Release\unit\CameraLeafTestSuite.o:CameraLeafTestSuite.cpp:(.text+0x97): undefined reference to `Camera::Camera(std::string, glm::detail::tvec3)' obj\Release\unit\CameraLeafTestSuite.o:CameraLeafTestSuite.cpp:(.text+0xe4): undefined reference to `SceneManagement::CameraLeaf::CameraLeaf(int, int, int, float, Camera*)' obj\Release\unit\TimeTestSuite.o:TimeTestSuite.cpp:(.text+0x25): undefined reference to `Time::getInstance()' collect2: ld gaf exit-status 1 terug Process terminated with status 1 (0 minutes, 3 seconds) 3 errors, 0 warnings (0 minutes, 3 seconds)
Я должен признать, что мое знание C++ не на высшем уровне, но до сих пор я был чтобы пройти. Я не совсем понимаю, как решить эту проблему. Модульные тесты находятся в подкаталоге проекта и должны быть доступны либо с включением каталога поиска, либо с использованием ../, чтобы перейти к уровню, на котором находится производственный код. Насколько я вижу, код найден, иначе компилятор выдаст мне ошибку, не найденную в файле. Поэтому я пришел к выводу, что это ошибка компоновщика. Однако это не относится к рекурсивному включению, поскольку камера не нуждается в cameraleaf, и тесты не нуждаются в вещах из среды unittest ++. Поэтому я немного в растерянности.
Предыстория:
Это все часть последнего назначения я должен сделать, чтобы завершить свою степень бакалавра, эти версии пришли с рекомендациями парнем, который преподает курс, как это лучше всего работает с котельным листовым металлом код, который он предоставил. По-видимому, есть некоторые проблемы с новыми версиями GCC. Я выполнил большую часть задания, но у меня возникли некоторые проблемы, поэтому я решил создать несколько тестов в конце концов.
Возможный дубликат [Что такое неопределенная ссылка/неразрешенная ошибка внешнего символа и как ее исправить?] (Http://stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved- external-symbol-error-and-how-do-i-fix) –
Нет, это не так. Для начала этот вопрос действительно слишком расплывчатый. Во-вторых, это ответ на самом деле не дает возможности ответить на мой вопрос. – Onno
Это так. Ошибки компоновщика * всегда * имеют одинаковые коренные причины. –