尝试使用UnitTest ++在测试中链接代码时链接器错误

时间:2013-06-24 13:37:45

标签: linker-errors unittest++

所以我使用的是Unittest ++(版本1.4)

我已经尝试过几个虚拟测试(CHECK(true)和CHECK(false),这些工作正常。但是,一旦我尝试包含一些生产代码,链接器就会疯狂地使用任何类或者从我为测试包含的标题中起作用。

我的问题是:

  1. 这可能是由UnitTest ++中的任何内容引起的吗?
  2. 如何在Code :: Blocks中设置我的代码或项目以使此错误消失?
  3. 详细说明:


    之前我使用过java和C#的单元测试,但我以前从未使用过基于C ++的单元测试包。我正在使用Code :: Blocks 12.11作为我的IDE和GCC 4.6.2作为编译器来完成我的工作。

    我已将UnitTest ++解压缩到我的tools文件夹,并按照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 ++的了解并不是一流的,但到目前为止,我已经能够顺利完成了。我不太清楚如何解决这个问题。单元测试位于项目的子目录中,并且可以使用搜索目录包含或使用../来访问,以跳到生产代码所在的级别。据我所知,找到了代码,否则编译器会向我发送一个未找到错误的文件。所以我得出结论,这必定是链接器错误。然而,这不是递归包含的情况,因为相机不需要相机叶片,测试也不需要来自unittest ++框架的东西。所以我现在有点不知所措。

    背景故事:


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

1 个答案:

答案 0 :(得分:2)

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

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

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

此简化示例演示了您要查找的链接器命令行:g++ -o yourTests CameraLeaf.o

我希望这会有所帮助。