如何将GCOV与Cmake一起使用
How to use gcov with Cmake
我在本指南之后遇到困难(我在另一篇文章中看到了建议)https://github.com/bilke/bilke/cmake-modules/blob/master/codecoverage.cmake
首先:
将此文件复制到您的CMAKE模块路径中。
我怎么知道我的cmake模块路径是什么?
使用函数setup_target_for_coverage创建自定义制作 目标
这到底是什么意思?我怎么做?特别是,我必须输入什么,在哪里?
我被迫用CMAKE编译该应用程序,否则我会使用GCC进行。
您通过调用来设置CMAKE模块路径 set(CMAKE_MODULE_PATH <path>)
CMAKE模块路径设置告诉CMAKE在哪里寻找CMAKE模块,例如include
宏所包含的模块。
例如,我采取的步骤使用codecoverage.cmake是:
- 复制codecoverage.cmake在"脚本/cmake'的源文件夹中"。
-
将以下内容添加到我的cmakelists.txt:
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/scripts/cmake) if (CMAKE_BUILD_TYPE STREQUAL "Coverage") include(CodeCoverage) setup_target_for_coverage(${PROJECT_NAME}_coverage ${TEST_TARGET} coverage) SET(CMAKE_CXX_FLAGS "-g -O0 -fprofile-arcs -ftest-coverage") SET(CMAKE_C_FLAGS "-g -O0 -fprofile-arcs -ftest-coverage") endif() #CMAKE_BUILD_TYPE STREQUAL "Coverage"
-
使用
-DCMAKE_BUILD_TYPE=Coverage
运行 运行
make
运行
make <coverage_target>
cmake
请注意:
-
${TEST_TARGET}
是一个变量I设置,其名称是我在脚本中之前创建的单元测试目标的名称。 -
<coverage_target>
是${PROJECT_NAME}_coverage
生成的任何字符串。 - 您不必像我一样用
if
包裹覆盖范围的创建。 - 由于我正在使用AppleClang,因此我必须修复CodeCoverage.cmake脚本以允许它。现在编写的方式允许GCC和Clang 3.0.0或仅较新。
gcov cmake
零行作为使用CMAKE模块进行GCOV集成的替代方法,可以在不修改构建系统的情况下使用它。您只需要大约5行的外壳。对于不太大或复杂的项目,这是一种很好的方法。
通过本书,必须将源文件名(不包括标题)的列表馈送到GCOV。这基于各种命名和目录约定:GCOV假设源文件具有诸如foo.c
或foo.cpp
之类的名称,并且相应的对象文件称为foo.o
,并且与源文件相同。但是默认情况下,cmake将它们称为foo.cpp.o
。GCOV剥离给定源文件名的扩展名,然后添加.gcno
和.gcda
后缀。我们可以通过喂食GCOV而不是源文件来利用这些事实,即 .gcda 文件。事实证明,在这种情况下,GCOV将在正确的位置寻找所有内容。
操作方法
通过将
--coverage
标志添加到CMAKE_C_FLAGS
和/或CMAKE_CXX_FLAGS
中,打开编译器和链接器标志中的覆盖范围数据。这使编译器在构建时间生成.gcno文件,并且在退出时使可执行文件dump .gcda文件。制作[运行测试/生成报告/清洁覆盖数据]循环的脚本。这是一个准骨bash示例:
# Ensure we are in the build directory and that coverage was enabled in the compiler grep -q -- --coverage CMakeCache.txt || exit 1 # Clean up old runtime data find . -name '*.gcda' -exec rm {} ; # Run test command (specified as script arguments) # This can be anything that runs program(s) built by the project "${@}" # Generate reports (.gcov files). All .gcda files in the build directory are passed as gcov args. find . -name '*.gcda' | xargs gcov
这种方法的优点
- 可以重复使用相同的脚本,而无需在每个感兴趣的项目上执行CMAKE集成
- 没有复杂的CMAKE代码
- 灵活性可以轻松更改测试命令。CMAKE集成的清洁/运行/报告循环可能具有一个硬编码命令来运行所有测试,这通常比运行一个测试的用途(且较慢)。
cons
- 丢失了完整的路径信息。每个.GCOV文件的名称仅包含basename(
foo.gcov
),而通常会像src#foo#foo.gcov
一样对完整路径进行编码。这可能会导致报告文件中的名称碰撞。 - 缺乏将依赖性信息集成到构建系统中意味着您可能会意外使用旧的.gcno文件忘记重建时(如果打开
--coverage
,然后关闭)。
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 将 OpenCV 与 CMAKE 中的项目一起构建为第三方库的正确方法
- 如何将GTest与CMake一起使用?遵循谷歌指南时的链接问题
- 如何将动态链接库与CMake一起使用
- SSE 标志应该如何与现代 CMake 一起添加?
- 将外部C++库与 CMake 一起使用时出错
- Catch2 单元测试未与 CMake 项目一起运行
- 如何将 Pybind11 与 CMAKE 一起使用以链接 2 个模块
- 如何将 c++20 模块与 CMake 一起使用
- 如何将编译的 wxwidgets 与 cmake 一起使用
- 当它们不与GCC和CMAKE一起使用时,如何解析未定义的引用
- CMake 项目结构:如何正确地将库合并在一起并将它们包含在多个可执行文件中
- 如何将库与CMAKE一起包含在OSX捆绑包中
- 当将QT创建者与CMAKE一起使用时,为什么我不必手动链接MSVC库
- 将特征与cmake一起使用
- 在将QT与Cmake一起使用时解决链接错误
- 将CMAKE与Code ::块一起使用
- 我如何配置我的cmake文件以与Google Test和CTEST一起使用
- cmake 找不到随 vcpkg 一起安装的库
- Googletest 在 bazel test 中永远不会失败(在它应该失败的地方),但与 cmake & clion 一起工作