1

所以我正在使用 Unittest++(1.4 版)

我已经尝试进行了几个虚拟测试(CHECK(true)和CHECK(false),它们工作正常。但是,一旦我尝试包含一些生产代码,链接器就会疯狂使用任何类或函数我为测试而包含的标题。

我的问题是:

  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 上无法正确显示)

结果是:

-------------- 构建:在场景图测试中发布(编译器:GNU GCC 编译器)---------------

mingw32-g++.exe -std=c++0x -Wall -fexceptions -O2 -march=core2 -I"C:\tools\Catch\Catch-0.7(2013 年 5 月)\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):未定义对“Camera::Camera(std::string, glm::detail::tvec3)”的引用
obj\Release\unit\CameraLeafTestSuite.o:CameraLeafTestSuite.cpp:(.text+0xe4): 未定义对 `SceneManagement::CameraLeaf::CameraLeaf(int, int, int, float, Camera*)' 的引用
obj\Release\unit\TimeTestSuite.o:TimeTestSuite.cpp:(.text+0x25): 未定义对 `Time::getInstance()' 的引用
collect2: ld gaf 退出状态 1 terug
进程以状态 1 终止(0 分 3 秒)
3 个错误,0 个警告(0 分 3 秒)

我必须承认我对 C++ 的了解并不是一流的,但到目前为止我已经过得去。我不太清楚如何解决这个问题。单元测试位于项目的子目录中,应该可以通过搜索目录包含或使用 ../ 跳到生产代码所在的级别。据我所知,找到了代码,否则编译器会抛出一个找不到文件的错误。所以我得出结论,这一定是链接器错误。但是,这不是递归包含的情况,因为相机不需要 cameraleaf,测试也不需要来自 unittest++ 框架的东西。所以我现在有点不知所措。

背景故事:


这是我完成学士学位所必须完成的最后一项任务的一部分,这些版本是由教授这门课程的人推荐的,因为它最适合他提供的样板代码。显然,较新版本的 GCC 存在一些问题。我已经完成了大部分作业,但是我遇到了一些问题,所以我还是决定创建一些测试。

4

1 回答 1

2

@R.MartinhoFernandes 是对的。这是一个链接器错误。

您需要告诉链接器包含您尝试使用的对象。

在此线程之后,您将找到有关该错误的另一个讨论。接受的答案建议添加object.o到 g++ 链接器命令。(在 codelite 的 IDE 中,这是在链接器的选项文本框中添加的。)我相信你会在 code::blocks 中找到自己的方式

这个简化的示例演示了您正在寻找的链接器命令行:g++ -o yourTests CameraLeaf.o

我希望这有帮助。

于 2013-07-12T15:29:23.997 回答