我有一个 CMake 项目,有时可能使用 clang,有时可能使用 gcc,有时可能使用 MSVC。 CMake 是否提供了一些通用的方法来生成覆盖率,或者我是否需要自己做 if else(gcc 和 clang 的编译器标志不同,MSVC 没有覆盖率)?
最佳答案
没有中央 cmake
选项来处理这种情况,但一些解决方案可能是:
- 不要做任何事情。使用
kcov
收集覆盖率统计信息,不需要特殊的编译器标志。 在常用的
Debug
、RelWithDebugInfo
等旁边添加构建配置。然后,仅在有意义时选择此构建配置,即在使用clang
或gcc
进行编译时。像这样:set(CMAKE_BUILD_TYPE "${CMAKE_BUILD_TYPE}" CACHE STRING "Build options: None Debug Release RelWithDebInfo MinSizeRel Coverage." FORCE) # Use generator expression to enable flags for the Coverage profile target_compile_options(yourExec $<$<CONFIG:COVERAGE>:--coverage>) # Don't forget that the linker needs a flag, too: target_link_libraries(yourExec PRIVATE $<$<CONFIG:COVERAGE>:--coverage>)
当您需要进一步分派(dispatch)编译器类型时,您也可以使用生成器表达式。
$<$<OR:$<CXX_COMPILER_ID:AppleClang>, $<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:GNU>>:-someOtherFlag>
但据我所知,
clang
和gcc
在覆盖标志方面没有真正的区别。不要添加其他构建配置,只需为您打算用于覆盖率报告的构建配置定义上述标志,可能是
Debug
。那么,显然有必要排除MSVC
。target_compile_options(yourExec $<$<AND:$<CONFIG:DEBUG>,$<NOT:CXX_COMPILER_ID:MSVC>>:--coverage>) target_link_libraries(yourExec PRIVATE $<$<AND:$<CONFIG:DEBUG>,$<NOT:CXX_COMPILER_ID:MSVC>>:--coverage>)
关于使用 CMake 的 C++ 覆盖设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54997358/