2013-06-24 1 views
1

Поэтому я использую UnitTest ++ (версия 1.4)компоновщика ошибки при попытке связать код в тестах с использованием UnitTest ++

Я попытался сделать несколько холостых испытаний (CHECK (правда) и проверить (ложь), и .. те, прекрасно работают, однако, как только я пытаюсь включить некоторые производственный код, компоновщик сходит с ума по сравнению с использованием какого-либо класса или функции из заголовков, которые я включил для тестирования

Мои вопросы:

  1. Это может быть вызвано чем-либо в UnitTest ++?
  2. Как настроить мой код или проект в 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. Я выполнил большую часть задания, но у меня возникли некоторые проблемы, поэтому я решил создать несколько тестов в конце концов.

+0

Возможный дубликат [Что такое неопределенная ссылка/неразрешенная ошибка внешнего символа и как ее исправить?] (Http://stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved- external-symbol-error-and-how-do-i-fix) –

+1

Нет, это не так. Для начала этот вопрос действительно слишком расплывчатый. Во-вторых, это ответ на самом деле не дает возможности ответить на мой вопрос. – Onno

+0

Это так. Ошибки компоновщика * всегда * имеют одинаковые коренные причины. –

ответ

2

@ R.MartinhoFernandes является правильным. Это ошибка компоновщика.

необходимо указать компоновщику, чтобы включить объект, который вы пытаетесь использовать.

, следующее за этим thread, вы найдете еще одну дискуссию относительно ошибки. Полученный ответ предлагает добавить команду object.o в g ++. (В среде IDE в codelite, это добавляется в текстовом поле опции компоновщика.) Я уверен, что вы сможете найти свой путь в коде :: блоков

это упрощенный пример демонстрирует командную строку компоновщика вы ищете: g++ -o yourTests CameraLeaf.o

Надеюсь, это поможет.

+0

После длительного поиска выяснилось, что Code :: Blocks должен знать о самих файлах, просто включить их в источники и указать каталоги поиска недостаточно, чтобы выполнить эту работу. – Onno

+0

Спасибо, я только начал с блоков кода и возникла проблема с настройкой UnitTest ++, просто нужно добавить файл в /usr/local/lib/libUnitTest++.a в список компоновщиков каталога, теперь он отлично работает. – kiwicomb123