源码与目标文件分目录时生成覆盖率报告的问题求助
解决LCOV/GenHTML找不到源码文件的问题
我之前处理过类似的目录结构问题,结合你的gcc和lcov版本,咱们一步步梳理解决方案:
问题根源
你的报错本质是:.gcno文件里记录的源码路径(仅module1.c)和实际文件路径(/root/proj/src/module1/module1.c)不匹配,导致LCOV/GenHTML在指定的基准目录下找不到对应文件。
1. 是否需要把.gcno/.gcda放到源码目录?
完全不需要。将编译产物(包括覆盖率文件)和源码分离是更合理的工程实践,没必要把它们混到源码目录里。问题出在编译逻辑和LCOV参数的配合上,不是文件存放位置的问题。
2. 如何通过参数设置源码路径?
有两个关键环节需要调整:
环节一:编译时确保生成正确的路径信息
在Makefile中编译模块时,要让GCC记录相对于源码根目录的完整路径,而不是仅文件名:
- 如果你的顶层Makefile在
/root/proj/src,编译module1时用如下命令(确保路径相对源码根):
这样生成的gcc -c -fprofile-arcs -ftest-coverage module1/module1.c -o ../build/obj/module1.o.gcno文件里会记录module1/module1.c,而非单纯的module1.c,后续LCOV就能正确匹配到源码文件。 - 如果是模块内的Makefile(比如
/root/proj/src/module1/Makefile),可以定义TOPDIR变量指向源码根目录,编译命令写成:
同样能让GCC记录完整的相对路径。gcc -c -fprofile-arcs -ftest-coverage $(TOPDIR)/module1/module1.c -o $(BUILDDIR)/obj/module1.o
环节二:调整LCOV命令的参数
如果已经编译完成不想修改Makefile,也可以通过LCOV参数修正路径映射:
- 最省心的方法是切换到源码根目录再运行LCOV,让相对路径更清晰:
之后回到build目录运行genhtml:cd /root/proj/src lcov -b . --directory ../build/obj --capture --output-file ../build/obj/app.info
这种方式下,LCOV会基于源码根目录(cd ../build/obj genhtml --legend -o ./latest_code_cov/ app.info/root/proj/src)查找.gcno里的路径,能准确定位到module1/module1.c这类文件。 - 若不想切换目录,也可以用
--base-directory参数明确每个模块的源码路径:lcov -b ../../src/ --directory . --base-directory ../../src/module1 --base-directory ../../src/module2 --capture --output-file app.info
验证小技巧
可以先用gcov测试单个文件的路径是否正确,比如在/root/proj/build/obj目录下运行:
gcov -o . ../../src/module1/module1.c
如果能生成module1.c.gcov文件,说明路径映射没问题,再跑LCOV就不会报错了。
内容的提问来源于stack exchange,提问作者CodeTry
相关产品推荐
相关产品推荐

