Evg*_*eny 4 c linux code-coverage gcov lcov
我正在尝试为在 Ubuntu 上同时具有 c++ 和 c 代码的项目收集代码覆盖率。
我使用 '-fprofile-arcs' 和 '-ftest-coverage' 值作为 CXXFLAGS 和 CFLAGS;'-lgcov' 作为 LINKFLAGS。
常见的C项目结构是:
c_code\
src
unit_tests
Run Code Online (Sandbox Code Playgroud)
src 包含静态库的来源。
unit_tests 目录包含使用 googletest 框架编写的测试,例如种类测试
TEST_F(test_case_name, test_name) {
some_gtest_assertions;
}
Run Code Online (Sandbox Code Playgroud)
在构建 googletest 二进制文件之后,该二进制文件应该包含要在其中进行测试的静态库。
项目二进制文件的构建和运行会生成 *.gcno 和 *.gcda 文件。但是我的 C 覆盖结果是空的(C++ 生成良好)。
lcov 命令具有以下格式:
lcov --capture --directory my_c_gcda_location --output-file c_coverage.info
Run Code Online (Sandbox Code Playgroud)
lcov 的日志显示了与 C 相关的 gcda 文件的以下内容:
gcov 没有为“my_c_gcda_location/*.gcda”创建任何文件
也有种类错误:
*.gcda:邮票与笔记文件不匹配
Should I specify some additional parameters or perform some additional actions to get coverage results for C? Or what can be the reason of these issues?
当 .gcda 文件比 .gcno 文件新时,您可能会遇到“标记不匹配”。
发生这种情况主要有两个原因: 1. 您可能在运行测试之后和生成跟踪文件之前重新构建了代码。2. 二进制文件可能在一台机器上构建,而测试在另一台机器上运行,其时间比构建机器早。
对于这两种情况,您只需确保 .gcda 的文件创建时间大于 .gcno 和 .c* 文件。
您可以通过执行“touch *.gcda”然后运行 lcov 命令来做到这一点。