以寒; 2024-07-10 10:06 采纳率: 0%
浏览 52
已结题

lcov覆盖不到源文件

项目有个apps目录,目录cmakelist内容如下,(没有add_library):

set(FILES x.cpp)
add_executable(x ${FILES})

target_link_libraries(x ${A} ${B})

set(TARGETS_IN_THIS_DIR
        x
        )

INSTALL_MACRO()

对应单元测试的cmakelists如下:

set(ut_exes
        "ut_x"
        )

foreach(exe_name ${ut_exes})
    add_executable(${exe_name} ${exe_name}.cpp
            ${CMAKE_SOURCE_DIR}/apps/x/x.cpp)
    target_link_libraries(${exe_name} gtest_main ${A} gtest)
endforeach()

检查编译和执行完单元测试后都有生成.gcno和.gcda文件,但是genhtml生成的报告中没有对应的x文件;
后面自己测试给x生成库然后在单元测试中链接就能正常显示,但是目前不想生成额外的库;
疑问是既然单元测试的cmakelists已经链接了源文件,为啥生成覆盖率覆盖不到呢
对应命令:
lcov -d ./ --no-external --rc lcov_branch_coverage=1 -c -o test.info
genhtml --branch-coverage -o result test.info

  • 写回答

28条回答 默认 最新

  • 杨同学* 2024-07-10 10:48
    关注
    获得7.50元问题酬金

    该回答结合ChatGPT4o及杨同学*共同作答, 如有帮助,还请采纳。
    在使用 lcov 生成代码覆盖率报告时,确保源文件被正确覆盖和报告生成中的几个关键点需要注意:

    1. 编译器选项:
      确保编译器使用了适当的选项来生成覆盖率信息。通常需要添加 -fprofile-arcs -ftest-coverage 选项。例如:

      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage")
      set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs -ftest-coverage")
      
    2. 源文件和生成文件位置:
      确保源文件和生成的 .gcno.gcda 文件在正确的位置,并且这些文件在运行 lcov 工具时能够被找到。

    3. 运行测试:
      在运行 lcov 命令之前,确保所有测试都已执行并生成了覆盖率数据文件 .gcda

    4. 正确的 lcov 命令:
      你提供的 lcov 命令看起来正确,但可以尝试在更具体的目录上运行以确保覆盖率信息被正确收集。例如:

      lcov --directory . --capture --output-file test.info --no-external --rc lcov_branch_coverage=1
      genhtml --branch-coverage --output-directory result test.info
      
    5. 单元测试 CMakeLists.txt:
      确保单元测试中正确链接了源文件。这看起来没有问题,但可以尝试明确设置目标属性:

      foreach(exe_name ${ut_exes})
          add_executable(${exe_name} ${exe_name}.cpp ${CMAKE_SOURCE_DIR}/apps/x/x.cpp)
          target_link_libraries(${exe_name} gtest_main ${A} gtest)
          set_target_properties(${exe_name} PROPERTIES COMPILE_FLAGS "-fprofile-arcs -ftest-coverage")
          set_target_properties(${exe_name} PROPERTIES LINK_FLAGS "-fprofile-arcs -ftest-coverage")
      endforeach()
      

    以下是一个完整的 CMakeLists.txt 示例,其中包含覆盖率的所有必要设置:

    CMakeLists.txt:

    cmake_minimum_required(VERSION 3.10)
    project(MyProject)
    
    set(CMAKE_CXX_STANDARD 11)
    
    # 设置编译选项以生成覆盖率数据
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage")
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs -ftest-coverage")
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fprofile-arcs -ftest-coverage")
    set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fprofile-arcs -ftest-coverage")
    
    # 源文件
    set(FILES x.cpp)
    
    # 可执行文件
    add_executable(x ${FILES})
    target_link_libraries(x ${A} ${B})
    
    # 单元测试
    set(ut_exes "ut_x")
    
    foreach(exe_name ${ut_exes})
        add_executable(${exe_name} ${exe_name}.cpp ${CMAKE_SOURCE_DIR}/apps/x/x.cpp)
        target_link_libraries(${exe_name} gtest_main ${A} gtest)
    endforeach()
    

    最后,确保在执行 lcov 命令时,.gcno.gcda 文件确实存在并且路径正确。你可以通过以下命令检查生成的覆盖率数据文件是否包含预期的源文件:

    lcov -l test.info
    

    这样可以确认覆盖率数据文件中是否包含你期望的源文件。如果上述步骤仍然无法解决问题,可能需要检查路径、文件权限或进一步细化调试过程。

    评论

报告相同问题?

问题事件

  • 系统已结题 7月18日
  • 创建了问题 7月10日