使用 CMake 的 C++ 覆盖设置

标签 c++ cmake

我有一个 CMake 项目,有时可能使用 clang,有时可能使用 gcc,有时可能使用 MSVC。 CMake 是否提供了一些通用的方法来生成覆盖率,或者我是否需要自己做 if else(gcc 和 clang 的编译器标志不同,MSVC 没有覆盖率)?

最佳答案

没有中央 cmake 选项来处理这种情况,但一些解决方案可能是:

  • 不要做任何事情。使用 kcov 收集覆盖率统计信息,不需要特殊的编译器标志。
  • 在常用的 DebugRelWithDebugInfo 等旁边添加构建配置。然后,仅在有意义时选择此构建配置,即在使用 clanggcc 进行编译时。像这样:

    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>
    

    但据我所知,clanggcc 在覆盖标志方面没有真正的区别。

  • 不要添加其他构建配置,只需为您打算用于覆盖率报告的构建配置定义上述标志,可能是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/

相关文章:

c++ - 如何告诉 CMake 在 Windows 上使用 Clang?

CMake:将相对路径转换为绝对路径,构建目录为当前目录

c++ - 在 C++ 中使用 * 输出 V

c++ - 为什么在编译期间尽管使用 -I(破折号大写 i)标志却出现 undefined reference 错误?

c++ - 尝试使用 CMake 和 MinGW W64 构建时出现多个重新定义错误

c++ - 错误:无法开始调试。命令 “-exec-run”的意外GDB输出。找不到进程ID 1401的Mach任务端口

linux - 在 ubuntu 32 位上构建 trilinos 时出现内部 cmake 错误

c++ - CMake compile -s -mt 版本的rabbitmq-c

c++ - 将派生类的成员分配给另一个派生类

c++ - FFTW:只对真实结果感兴趣