gcov处理C++文件时无法识别.cpp后缀导致文件无法打开的问题
问题原因与解决方案
核心原因
你遇到的问题是gcov对文件名的匹配规则和CMake生成的gcno/gcda文件名不兼容:
- 执行
gcov file_test.cpp时,gcov会自动去掉源文件的.cpp后缀,尝试寻找file_test.gcno和file_test.gcda; - 但CMake构建时,生成的目标文件是
file_test.cpp.o,对应的gcno/gcda文件会继承这个命名,变成file_test.cpp.gcno和file_test.cpp.gcda,导致gcov找不到匹配的文件。
复制.cpp文件到目标目录无法解决问题,因为gcov的匹配逻辑是基于文件名后缀截断,而非源文件是否存在。
解决方法
方法1:直接指定gcov的匹配文件或目录
在包含file_test.cpp.gcno和file_test.cpp.gcda的目录下,执行以下任意一条命令:
- 直接指定gcno文件:
gcov file_test.cpp.gcno - 使用
-o参数指定目标文件所在目录,让gcov自动匹配对应文件:gcov -o . file_test.cpp
方法2:修改CMake配置统一文件名格式
在项目的CMakeLists.txt中添加以下配置,让CMake生成的目标文件(.o)去掉.cpp后缀,对应的gcno/gcda文件名也会同步简化:
set(CMAKE_CXX_OUTPUT_EXTENSION_REPLACE ON)
重新构建项目后,生成的文件会变成file_test.o、file_test.gcno、file_test.gcda,此时直接执行gcov file_test.cpp即可正常生成覆盖率报告。
内容的提问来源于stack exchange,提问作者Bob
相关产品推荐
相关产品推荐

