【问题标题】:Boost Unit Test framework can't find main functionBoost Unit Test框架找不到主要功能
【发布时间】:2016-04-16 23:07:30
【问题描述】:

我有这个最小的单元测试:

#include <boost/test/unit_test.hpp>
#define BOOST_TEST_MODULE a_test

struct Color{};

BOOST_AUTO_TEST_CASE(color_test)
{
    BOOST_CHECK(std::is_pod<Color>());
}

但是当我像这样编译它时

clang -std=c++14 -lc++ -lboost_unit_test_framework a_test.cc -o main

我得到 _main 的未定义符号。 -lboost_unit_test_framework 使用共享库。

我以前使用过这个库,我记得自己不必声明 main 函数,因为它会自动运行我定义的几个 BOOST_AUTO_TEST_CASEs。

我做错了什么?

【问题讨论】:

  • BOOST_TEST_MODULE 定义在包含之前。 Boost 检测到它,然后为你生成一个 main 函数。
  • @melak47 不幸的是,这也不起作用
  • 啊,你也错过了libboost_test_exec_monitor.a! :)
  • 另外,等一下——如果你想使用共享库,我相信你必须#define BOOST_TEST_DYN_LINK。没有它,它假定静态库。
  • 就是这样!我不明白程序如何决定是使用静态库还是共享库,这不是链接器的工作吗?无论如何,如果您将其发布为答案,我会接受。

标签: c++ unit-testing boost


【解决方案1】:

动态链接Boost.Test时,需要定义BOOST_TEST_DYN_LINKsee boost docs here)。

您可能还需要链接boost_test_exec_monitor

另外,所有的配置宏都需要在包含库头之前定义才能生效。

【讨论】:

    【解决方案2】:

    @melak47 也是对的。我相信以下内容也应该有效:

    #define BOOST_TEST_MODULE my_tests TestSuites // to define main()
    #include <boost/test/unit_test.hpp>
    
    struct Color{};
    
    BOOST_AUTO_TEST_SUITE(MyColorTests)
    
    BOOST_AUTO_TEST_CASE(color_test)
    {
        BOOST_CHECK( std::is_pod<Color>() );
    }
    
    BOOST_AUTO_TEST_SUITE_END()
    

    如果您将多个此类模块链接在一起,请确保 BOOST_TEST_MODULE 仅在其中一个中定义,包含之前。

    【讨论】:

    • 既然有主测试套件,我不认为有另一个顶级套件是绝对必要的。请参阅此minimal example。不过不会受伤:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多