【问题标题】:Linker errors when trying to link code in tests using UnitTest++尝试使用 UnitTest++ 在测试中链接代码时出现链接器错误
【发布时间】:2013-06-21 01:03:23
【问题描述】:

所以我使用的是 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 存在一些问题。我已经完成了大部分作业,但是我遇到了一些问题,所以我还是决定创建一些测试。

【问题讨论】:

  • 不,不是。对于初学者来说,这个问题实在是太模糊了。其次,它的答案并不能真正提供回答我问题的方法。
  • 是的。链接器错误总是具有相同的根本原因。
  • 就像我在问题中所说的那样,我已经包含了所有必要的库,没有递归包含并且主要存在。
  • 链接器说你没有。我更信任它。需要明确的是,这与#includes 无关。

标签: linker-errors unittest++


【解决方案1】:

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

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

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

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

我希望这会有所帮助。

【讨论】:

  • 经过长时间的搜索,发现 Code::Blocks 也必须知道文件本身,仅将它们包含在源中并指定搜索目录不足以完成工作。
  • 谢谢,我刚开始使用代码块,但在设置 UnitTest++ 时遇到了问题,只需将 /usr/local/lib/libUnitTest++.a 中的文件添加到目录的链接器列表中即可很棒。
猜你喜欢
  • 2012-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-11
  • 1970-01-01
  • 2013-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多