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

Linker errors when trying to link code in tests using UnitTest++

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

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

我的问题是:

  • 这可能是由UnitTest ++中的任何东西引起的吗?
  • 如何在Code :: Blocks中设置我的代码或项目以使此错误消失?
  • 细节:

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

    我已将UnitTest ++解压缩到我的tools文件夹,并按照http://wiki.codeblocks.org/index.php?title=UnitTesting教程中的说明进行编译,并成功构建了库文件。我已将库文件的位置添加到测试项目的设置文件中的链接器搜索目录设置中。

    被测试的代码在其自己的项目中编译良好,但在从测试中调用时则不然。

    我已经设置了我的项目,以便每个类都在自己的测试文件中进行测试。
    我有一个main.cpp将所有测试绑定在一起。

    1
    2
    3
    4
    5
    6
    #include UnitTest++.h

    int main(int, char const *[])
    {
        return UnitTest::RunAllTests();
    }

    我试图测试的一个类是CameraLeaf:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #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上正确显示)

    结果是:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    -------------- 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
    elease\unit\CameraLeafTestSuite.o
    mingw32-g++.exe  -o"bin
    elease\Scene Graphs Tests.exe" obj
    elease\unit\CameraLeafTestSuite.o obj
    elease\unit\TimeTestSuite.o"obj
    elease\Scene Graphs Tests\main.o"   -s  C:\tools\UnitTest++\Deliv
    elease\libUnitTest++.a
    obj
    elease\unit\CameraLeafTestSuite.o:CameraLeafTestSuite.cpp:(.text+0x97): undefined reference to `Camera::Camera(std::string, glm::detail::tvec3)'
    obj
    elease\unit\CameraLeafTestSuite.o:CameraLeafTestSuite.cpp:(.text+0xe4): undefined reference to `SceneManagement::CameraLeaf::CameraLeaf(int, int, int, float, Camera*)'
    obj
    elease\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存在一些问题。我已经完成了大部分任务,但是我遇到了一些问题,所以我决定创建一些测试。


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

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

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

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

    我希望这有帮助。