Boost.Test - 重写主要的问题

问题描述:

我想在使用Boost.Test时提供我自己的主要功能。所以我已经包括下面的宏:Boost.Test - 重写主要的问题

#define BOOST_TEST_ALTERNATIVE_INIT_API 
#define BOOST_TEST_NO_MAIN 

在我的主要功能,我不得不打电话:

::boost::unit_test::unit_test_main(&registering_all_tests, argc, argv) 

,但是这给了我下面的错误时,建立在使用Xcode的6 OS X:

Undefined symbols for architecture x86_64: 
    "boost::unit_test::unit_test_main(bool (*)(), int, char**)", referenced from: 
     _main in main.o 

我发现包括以下文件:

#include <boost/test/included/unit_test.hpp> 

解决了这个问题,但我对这个问题感到困惑。这个文件的描述指出它使用了单元测试框架的包含(与链接)版本。

Boost入门指南指出:

如Boost.Test可以在“仅标头”或“单独编译”模式下使用, 虽然独立编译建议使用严重

我已经分开建立了库。

升压文档还指出:

直接包括UTF到您的测试模块

如果你喜欢,以避免独立的库编译就可以 既包括构成静态库中的所有文件您的 测试模块的生成文件或将它们作为测试模块的源文件的一部分。为了方便后面的变体,UTF提供了 单头使用变体。无论哪种情况,默认情况下都不需要特殊编译选项 或宏定义添加到编译 选项列表。但是,在这种情况下,可以使用与独立库编译相同的标志。显然,虽然, ,但BOOST_TEST_DYN_LINK和BOOST_TEST_NO_LIB都不适用 。长期来看,这种解决方案可能并不是最好的选择,因为它需要为每个测试模块 使用的每个测试模块 重新编译UTF源文件,并且每次更改测试模块 。结果你的测试周期时间可能会增加。如果它成为 令人讨厌,我建议切换到其中一个预建库使用 变种。

看来,通过选择包含单元测试框架的包含(对比链接)版本,我是错误的东西。

有人可以澄清正确的方法。重写主要的例子没有提到需要这样做。

最新版本的Boost.Test documentation比以前的版本更详细地介绍了这个主题。

通过建立与定义的符号BOOST_TEST_NO_MAIN单元测试框架的静态库的话,我可以提供我自己的主要功能,使用默认初始化函数init_unit_test作为第一个参数手动调用默认测试运行unit_test_main

int exitCode = ::boost::unit_test::unit_test_main(&init_unit_test_suite, argc, argv); 

没有必要定义BOOST_TEST_ALTERNATIVE_INIT_API