lcov 与 googletest 单元测试的 gcov 覆盖结果不匹配

5 c++ code-coverage googletest gcov lcov

我正在尝试通过为源文件创建 googletest 单元测试,然后使用 gcov 获取覆盖结果,最后使用 lcov 生成 html 文档来收集库文件 foobar.cpp 上的覆盖结果。

我已经得到了单元测试和 gcov 结果可以正常工作但是 lcov 从来没有描绘出正确的覆盖结果,完全省略了我的 foobar.cpp .gcov 结果?

我有一个单元测试平台,基本上是这样设置的:

目录:

~/svn/googletest-read-only/
    /src
        gtest_main.cc
        gtest-all.cc
    /include
~/code/proj/
    foobar.cpp 
    foobar.hpp
~/code/proj/unittest/
    foobar_test.cpp
    Makefile
Run Code Online (Sandbox Code Playgroud)

一切都从unittest/运行,我 make unittest/ $ make,在这个文件夹中生成一个可执行文件foob​​ar_test。的主()是在googletest / SRC / gtest_main.cc文件。我的 Makefile 基于 googletest 并具有以下显着设置:

生成文件:

CXXFLAGS += -g -O0 --coverage -fprofile-arcs -ftest-coverage -Wall -Wextra -pthread LDFLAGS = -lpthread -lgcov foobar_test : foobar.o foobar_test.o gtest_main.a $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(LDFLAGS) $^ -o $@

我运行一次可执行文件$ ./foobar_test。这会生成 .gcda 以匹配每个源的 .gcno(总共 4 倍:foobar、foobar_test、gtest_main 和 gtest-all)。

然后$ gcov foobar.cpp仅在 foobar.cpp 上运行(我也尝试过类似的替代方案$ gcov *.cpp......仅使用 foobar_test.cpp 不起作用)。这会产生标准输出,其中包括一堆 /usr/lib 废话,但也包括我的结果:文件 '../foobar.cpp'; 执行的行数:80 行的 61.25%;..`并创建我的 .gcov 文件。

检查我的 .cpp.gcov 文件,它显示了 61.25% 的行如上所述的良好命中。在这一点上,我有 4 个 .gcda、4 个 、gcno 和大约 20 个其他 .gcov 文件。

现在,当我尝试在这里使用 lcov 时,lcov --directory . -c -o result.info它出错了。

lcov 结果:

Capturing coverage data from .
Found gcov version: 4.4.7
Scanning . for .gcda files ...
Found 4 data files in .
Processing ./gtest_main.gcda
geninfo: WARNING: cannot find an entry for foobar.cpp.gcov in .gcno file, skipping file!
geninfo: WARNING: cannot find an entry for *more c++ files*.gcov in .gcno file, skipping file!
Processing ./foobar.gcda
geninfo: WARNING: no data found for /home/asdf/code/proj/foobar.cpp
Processing ./foobar_test.gcda
geninfo: WARNING: no data found for /home/asdf/code/proj/unittest/foobar_test.cpp
Processing ./gtest-all.gcda
Finished .info-file creation```
Run Code Online (Sandbox Code Playgroud)

$ genhtml report.info --output-directory report && firefox report/index.html仅显示大约 5 个不包含任何 foobar* 文件的目录后查看 lcov 输出?

我已经尝试了多种组合$ gcov []cpp以及$ lcov --base-directory [] --directory [] -c -o无济于事。还尝试软链接一些源文件,没有帮助。

我的设置或命令需要更改什么?欢迎评论者提出更好的解决方案。