1

我正在使用 cmake 构建系统开发一个项目。默认情况下,CMake 有一个很好的框架,可以从一组 C/C++ 代码生成单个可执行文件。cmake 函数称为create_test_sourcelist。它的作用是生成一个带有单个主入口点的 C/C++ 调度程序,该入口点将调用其他 C/C++ 代码。

因此,我有一堆带有函数签名的 C/C++ 文件,例如:int TestFunctionality1(int argc, char *argv[]),我想保持原样,除非它当然意味着更多的工作。

我怎样才能保持这个系统到位并开始使用BOOST_CHECK?我不知道如何指定实际的主入口点不被调用int main(int argc, char *argv[])

我的目标是有一个与 Jenkins 集成的框架,因为该项目已经使用了 Boost,我相信这应该是可行的,而无需重新编写现有的 CMake 测试套件并将所有测试更改为独立的main功能。

4

1 回答 1

1

不幸的是,似乎没有直接而干净的方法来做到这一点。

从一侧唯一有用的的功能create_test_sourcelist是生成一个测试驱动程序:a(愚蠢的非常简单、幼稚且缺乏破解/扩展的能力)基于 C/C++ 翻译单元${cmake-prefix}/share/cmake/Templates/TestDriver.cxx.in(并且无法选择其他模板)。

另一方面,Boost UTF 提供了自己的测试运行程序(相当于CMake 术语中的测试驱动程序),但在任何变体(静态、动态、单头)中,它都包含main()某种方式的定义(即使在外部测试运行器)。

......所以你最终有两个main()功能,无法选择一个。

深入研究create_test_sourcelist我真的很想知道为什么他们将其实现为命令而不是序数(外部)cmake 模块 - 它没有任何特殊功能(无法使用 CMake 语言实现)。这个命令真的很愚蠢——它不检查所需的函数是否真的存在(如果有错误,你会得到编译错误)。根本没有办法灵活定制输出源文件。所做的只是从源文件列表中剥离路径和扩展名,并使用序数将其替换为提到的模板configure_file()......</p>

所以,我个人认为根本没有理由使用它。这就是为什么我在上面评论中提到的模块中做了同样的(但更好;)工作。

如果您仍然想使用该命令,如果您想使用 Boost UTF ,生成的测试驱动程序完全没用。无论如何,您都需要提供自己的初始化函数(它不是main()),您可以在其中手动将测试用例注册到主测试套件中(或将测试组织到一些更复杂的树中)。在那种情况下,绝对没有理由使用create_test_sourcelist!您可以从中获得的所有内容都是需要提供的源列表add_executable()……但是使用/执行起来要容易得多set()……此命令甚至无法通过测试函数列表(文件名列表 w/ o 扩展名)来调用(它在内部使用而不是导出)。你还想用那个命令吗??

于 2015-07-01T06:37:38.843 回答