You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用cmake与mingw gcc编译如何生成OpenCppCoverage所需的pdb文件

问题根因

你当前使用的MinGW GCC编译器默认生成DWARF格式的调试信息,而你配置的所有CMAKE_PDB_OUTPUT_DIRECTORY、COMPILE_PDB_*、PDB_*相关的CMake属性都是MSVC编译器特有的配置,对GCC完全不生效,所以自然无法生成PDB文件。

现有CMake配置的错误点
  • CMAKE_BUILD_TYPE的设置位置错误,该变量需要放在project()指令之前定义,或在执行cmake构建命令时通过参数指定,放在add_executable之后的配置不会生效。
  • 错误使用了仅MSVC支持的PDB相关配置项,对MinGW环境无意义。
解决方案

按照以下步骤修改配置,即可生成OpenCppCoverage所需的PDB文件:

  1. 添加GCC生成CodeView格式调试信息的编译、链接选项
    CodeView是PDB文件使用的调试信息格式,MinGW GCC从5.0版本开始支持通过-gcodeview参数生成对应格式的调试信息,在CMake中添加如下配置:
cmake_minimum_required(VERSION 3.17)

# 构建类型要放在project指令之前定义,也可以在cmake命令行通过-DCMAKE_BUILD_TYPE=Debug指定
set(CMAKE_BUILD_TYPE Debug CACHE STRING "Build type" FORCE)

project(GUnitTestingVSCode)

# MinGW GCC 专属配置:生成CodeView格式调试信息,关闭优化避免调试信息丢失
if(MINGW AND CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
    add_compile_options(-gcodeview -O0)
    add_link_options(-gcodeview)
endif()

# 其余原有配置(add_subdirectory、编译宏、头文件路径、源文件遍历)保留即可
add_subdirectory(googletest)
add_compile_definitions(TELEMETRY_DIAGNOSTICS)
add_compile_definitions(GTEST)

include_directories(googletest/include/)
include_directories(googletest/googlemock/include/gmock/)
include_directories("${CMAKE_SOURCE_DIR}/"
    "${CMAKE_SOURCE_DIR}/inc/"
    "${CMAKE_SOURCE_DIR}/mocks/"
    "${CMAKE_SOURCE_DIR}/../submodule/library/inc"
    "${CMAKE_SOURCE_DIR}/../submodule/library/inc/Application"
    "${CMAKE_SOURCE_DIR}/../submodule/library/inc/Datalink/"
    "${CMAKE_SOURCE_DIR}/../submodule/library/inc/Demodulation"
    "${CMAKE_SOURCE_DIR}/../submodule/library/inc/Modulation"
    "${CMAKE_SOURCE_DIR}/../inc/Peripherals/"
    "${CMAKE_SOURCE_DIR}/../inc/Protocol/"
    "${CMAKE_SOURCE_DIR}/../inc/Diagnostics/")

file(GLOB_RECURSE SOURCES RELATIVE
    ${CMAKE_SOURCE_DIR} "../src/Peripherals/DMA.c" "../src/Diagnostics.c"
    ${CMAKE_SOURCE_DIR} "../src/Protocol/DataLink.c"
    "src/*.cpp" "googletest/*.cpp" "mocks/*.c"
    "../submodule/library/src/*.c")

add_executable(gUnitTest ${SOURCES})
target_link_libraries(gUnitTest PUBLIC gtest gmock)

注意:删除原有配置中所有PDB相关的set_target_properties配置项,这些内容对MinGW无效

  1. 从生成的可执行文件中提取PDB文件
    MinGW编译生成的gUnitTest.exe会直接嵌入CodeView格式的调试信息,你需要使用MinGW配套的cv2pdb工具将调试信息提取为独立的PDB文件,在build目录下执行以下命令即可:
cv2pdb gUnitTest.exe

执行完成后会在同目录下生成gUnitTest.pdb文件,该文件即可直接用于OpenCppCoverage的覆盖率检测。

  1. 验证有效性
    生成PDB后,正常运行OpenCppCoverage指令即可得到正确的覆盖率结果,建议在指令中添加排除规则过滤掉googletest、mock等非业务代码的统计。

内容的提问来源于stack exchange,提问作者Edson Manoel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 13:24:00