【问题标题】:Boost test linking提升测试链接
【发布时间】:2011-12-08 13:03:35
【问题描述】:

我想在我的项目中使用Boost test

我在我的项目中使用了 cmake,所以我写了一个简单的 CMakeList.txt 来包装它:

find_package (Boost COMPONENTS unit_test_framework REQUIRED)
file(GLOB_RECURSE UnitTests_sources tests/*.cpp)
add_executable(UnitTests
    ${UnitTests_sources}
)
enable_testing()
ADD_TEST (UnitTests UnitTests)

所以,cmake 在这里可以正常工作。编译时出现问题:

链接 CXX 可执行文件 ../../bin/UnitTests

/usr/lib/gcc/x86_64-unknown-linux-gnu/4.6.1/../../../../lib/crt1.o:在 功能_start': (.text+0x20): undefined reference tomain' collect2: ld 返回 1 个退出状态

这是 tests 文件夹 (LogManagerTest.cpp) 中唯一的文件:

#include "Utils/LogManager.hpp"
#include <boost/test/unit_test.hpp>

#define BOOST_TEST_DYN_LINK
#define BOOST_TEST_MAIN

#define BOOST_TEST_MODULE LogManager

BOOST_AUTO_TEST_CASE(LogManagerCase)
{
    BOOST_REQUIRE(true);
    /*LogManager manager;
    manager.Initialize();
    manager.Deinitialize();*/
}

这里有什么问题?

【问题讨论】:

  • 只需转到starter example,然后转到usage variants。如果您对链接器选项等不满意,请坚持使用 Boost.Test 的仅标头变体。是的:更改宏和包含的顺序确实有影响。

标签: c++ unit-testing boost linker boost-test


【解决方案1】:

添加

ADD_DEFINITIONS(-DBOOST_TEST_DYN_LINK) 

到您的 CMakeLists.txt 中,以便它会自动为您生成一个 main()。 还有,

#define BOOST_TEST_MODULE xxx

必须在包含 unit_test.hpp 之前定义。

您可以找到更多信息和选项: http://www.boost.org/doc/libs/1_47_0/libs/test/doc/html/utf/compilation.html

【讨论】:

  • 它是在我的 cpp 文件中定义的,不是吗? (您的想法返回给我警告,BOOST_TEST_DYN_LINK 已重新定义)。
  • 只有在包含 后才定义。所以没有影响。您必须在之前定义。
  • 我发现虽然ADD_DEFINITIONS(-DBOOST_TEST_DYN_LINK) 解决了 Linux 上的问题,但它破坏了我在 WIndows(MinGW) 上的构建。如果您遇到这种情况,请考虑将这一行包含在 IF(UNIX) ... ENDIF(UNIX) 中。
【解决方案2】:

您需要使用 -lboost_unit_test_framework 进行编译,如果您使用 BOOST_TEST_DYN_LINK,boost 会为您生成 main,因此您需要告诉 makefile 查找该 main。然后您可以使用以下代码进行编译:

#define BOOST_TEST_DYN_LINK
#define BOOST_TEST_MODULE LogManager                                   
BOOST_AUTO_TEST_CASE(LogManagerCase)                                   
{                                                                      
    BOOST_REQUIRE(true);                                               
    /*LogManager manager;                                              
    manager.Initialize();                                              
    manager.Deinitialize();*/                                          
}                                                                      
BOOST_AUTO_TEST_SUITE_END()    

【讨论】:

    【解决方案3】:

    尝试移动

    #define BOOST_TEST_DYN_LINK
    #define BOOST_TEST_MAIN
    

    在您包含之前 - 它对我有用。

    【讨论】:

      【解决方案4】:

      有一次我犯了一个愚蠢的错字,也得到了这个。编译器被骗了。

      就像“#define BOOTS_TEST_MODULE DUMMY”一样。是的,我喜欢靴子:)

      【讨论】:

        猜你喜欢
        • 2012-06-21
        • 2011-07-11
        • 2011-12-24
        • 2013-01-21
        • 2011-01-20
        • 2012-07-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多