Windows下编译未生成.gcno文件 导致gcovr无法输出覆盖率报告
问题根因
核心诱因是编译命令中携带的-fcompare-debug-second参数。该参数是GCC开发团队用于编译器自身功能调试的内部参数,不应该出现在普通业务代码、测试代码的编译指令中。在Windows平台MinGW发行的GCC 8.x版本中,该参数会中断编译阶段的覆盖率笔记文件生成流程,导致.gcno文件无法产出,但不会影响运行时插桩逻辑,因此程序运行后仍会正常生成.gcda文件。缺少.gcno记录的源码行、块结构信息时,gcovr无法关联覆盖率运行数据和源码内容,最终输出全0的空报告。
修复步骤
- 第一步:清理目录下旧的构建产物,删除已生成的
beta.exe、所有.gcda残留文件,避免旧数据干扰后续流程。 - 第二步:移除编译命令中的
-fcompare-debug-second参数,使用修正后的命令重新编译:
gcc -Wall -Wno-unknown-pragmas -fprofile-arcs -ftest-coverage -DUTEST AllTests.c CuTest.c BZR2.c BZR2_test.c -o beta.exe
- 第三步:编译完成后检查当前目录,确认每个参与编译的
.c文件都已生成同名.gcno文件。 - 第四步:运行重新编译生成的
beta.exe,等待所有单元测试用例执行完毕,目录下会生成对应更新后的.gcda文件。 - 第五步:在当前目录执行
gcovr -r .命令,即可正常输出完整的代码覆盖率统计报告。
额外排查点
如果按上述步骤操作后仍无法正常生成报告,可逐一核对以下配置:
- 确认系统环境变量中调用的
gcc和gcov版本完全匹配,当前环境使用的8.1.0版本组合不存在兼容性问题,不要出现多版本MinGW混用导致gcov版本和gcc版本不一致的情况。 - 所有编译、运行、生成报告的操作都在源码所在的根目录下执行,不要切换工作目录调用程序或gcovr,避免路径解析失败。
内容的提问来源于stack exchange,提问作者Risusdan
相关产品推荐
相关产品推荐

