为 gcov 编译 googletest

Posted

技术标签:

【中文标题】为 gcov 编译 googletest【英文标题】:Compiling googletest for gcov 【发布时间】:2014-01-13 20:59:39 【问题描述】:

我想从我的 googletest 测试中获取覆盖率信息,但我找不到好的说明。

我想我应该编译我的 gtest 二进制文件,这样它会吐出 .gcno.gcna 文件。然而,编译器标志的组合似乎不会发生这种情况。

我曾尝试在编译和链接上使用--coverage-fprofile-arcs -ftest-coverage,但无济于事。

我只是在整个方法中弄错了吗? googletest 测试会像这样编译吗?

为了完整起见,这里是整个makefile:

# -*- indent-tabs-mode:t; -*-

## Vars
CXX=g++
BDDOBJ=../obj
OBDD_DIR=../src
OBDD_INCLUDE=-I$(OBDD_DIR)
#FLAGS=-Wfatal-errors -I./gtest-1.7.0/include  -L./gtest-1.7.0/lib/.libs -lgtest -lgtest_main -lpthread

GTEST_DIR=./gtest-1.7.0
SRCDIR=./src
OBJDIR=./obj
BINDIR=./bin
LIBDIR=./lib
VPATH=$(SRCDIR) $(OBJDIR) $(LIBDIR) $(BINDIR)
COVERAGE=-O0 -g --coverage

MKDIR=mkdir -p
RM=rm -rf

.PHONY: clean
.INTERMEDIATE: default $(BINDIR) $(OBJDIR) $(LIBDIR)

default: obddtest

#Binary
obddtest: $(BINDIR) libgtest.a Vertex.o Vertex_unittest.o Edge.o Edge_unittest.o Graph.o Graph_unittest.o main.o 
    g++ $(COVERAGE) -isystem $GTEST_DIR/include $(OBDD_INCLUDE) -pthread \
    $(OBJDIR)/Vertex.o \
    $(OBJDIR)/Vertex_unittest.o \
    $(OBJDIR)/Graph_unittest.o \
    $(OBJDIR)/Edge.o \
    $(OBJDIR)/Edge_unittest.o \
    $(OBJDIR)/Graph.o \
    $(OBJDIR)/main.o \
    $(LIBDIR)/libgtest.a \
        -o $(BINDIR)/obddtest

## Main
main.o: main.cc 
    g++ $(COVERAGE) -isystem $GTEST_DIR/include $(OBDD_INCLUDE) -pthread -c $< -o $(OBJDIR)/$@

## gtest library
gtest-all.o: $(OBJDIR)
    g++ $(COVERAGE) -isystem $GTEST_DIR/include -I$GTEST_DIR -pthread -c $GTEST_DIR/src/gtest-all.cc -o $(OBJDIR)/gtest-all.o

libgtest.a: $(LIBDIR) gtest-all.o
    ar -rv $(LIBDIR)/libgtest.a $(OBJDIR)/gtest-all.o

## Source under test
%.o: $(OBDD_DIR)/%.cpp $(OBJDIR) 
    g++ $(COVERAGE) -fPIC -O0 $(OBDD_INCLUDE) -c $< -o  $(OBJDIR)/$@

## Tests
%_unittest.o: %_unittest.cc $(OBJDIR) 
    g++ $(COVERAGE) -isystem $GTEST_DIR/include $(OBDD_INCLUDE) -pthread -DTESTDATA=\"$(CURDIR)/data/\" -c $< -o $(OBJDIR)/$@

## Housekeeping
$(LIBDIR):
    $(MKDIR) $(LIBDIR)

$(OBJDIR):
    $(MKDIR) $(OBJDIR)

$(BINDIR):
    $(MKDIR) $(BINDIR)

clean:
    $(RM) $(LIBDIR) $(OBJDIR) $(BINDIR)

【问题讨论】:

添加 CFLAGS=-fprofile-arcs -ftest-coverage。或者尝试像g++ -fprofile-arcs -ftest-coverage unittest.cc -o unittest.o 这样的单一源文件。编译后检查 .gcno 文件 presenet。 @jsj 你找到答案了吗? 【参考方案1】:

您必须在编译和链接上都添加 --coverage,因为您已经正确地这样做了。这会生成字节码,在访问时将输出覆盖信息。要生成 gcov 将检查的所有文件,您现在只需运行该程序(或 googletest 生成的测试程序)。运行一次后(并且只运行一次,因为如果多次运行它会添加到观察到的数据中),您将看到生成的文件,您现在可以调用 gcov。

从您的(正确的)makefile 看来,您只是缺少“运行测试程序”步骤。

【讨论】:

在我的例子中,.gcno 和 .gcna 被放置在源文件所在的位置。这可能很难找到。

以上是关于为 gcov 编译 googletest的主要内容,如果未能解决你的问题,请参考以下文章

使用 c++ 编译器运行 gcov 工具

交叉编译环境下gcov的使用

C++ 使用 gcov 和 lcov 的问题?

gcov 与 CMake 使用单独的构建目录

GCOV入门

gcov 符号在哪里?