能否使用gcov检测共享库的代码覆盖率?

4
我试图测试一个使用OpenCV共享库的可执行文件。当使用gcov来了解哪些代码行被覆盖时,我只能得到有关我的.cpp文件和该库的.hpp文件的信息。没有任何关于该库的.cpp文件的信息被显示出来。
我使用-pg --coverage标志进行编译和链接。
1个回答

7
是的,gcov可以提供有关共享库的覆盖率信息。如果我记得没错,在我的项目中遇到这个问题时,你可能没有在动态库链接时包含--coverage标志。下面是我能够创建的最小示例。
Makefile:
CXXFLAGS += --coverage
LDFLAGS += --coverage

myexec: myexec.cpp libmylib.so

libmylib.so: mylib.o
    gcc --coverage -shared -Wl,-soname,libmylib.so -o libmylib.so mylib.o

mylib.o: CXXFLAGS += -fPIC

myexec.cpp:

#include "mylib.h"

int main(int argc, char** argv)
{
    return is_even(argc);
}

mylib.h

#ifndef MYLIB_H
#define MYLIB_H

int is_even(int num);

#endif

mylib.cpp

#include "mylib.h"

int is_even(int num)
{
    if (num % 2)
        return false;
    else
        return true;
}

make的输出(这样您就可以看到确切的构建内容):

g++ --coverage -fPIC   -c -o mylib.o mylib.cpp
gcc --coverage -shared -Wl,-soname,libmylib.so -o libmylib.so mylib.o
g++ --coverage  --coverage  myexec.cpp libmylib.so   -o myexec

我使用 LD_LIBRARY_PATH="." ./myexec a 命令运行了可执行文件,并且使用 gcov mylib.cpp 命令进行了运行。以下是 mylib.cpp.gcov 文件的内容:

    -:    0:Source:mylib.cpp
    -:    0:Graph:mylib.gcno
    -:    0:Data:mylib.gcda
    -:    0:Runs:1
    -:    0:Programs:1
    -:    1:#include "mylib.h"
    -:    2:
    1:    3:int is_even(int num)
    -:    4:{
    1:    5:    if (num % 2)
#####:    6:        return false;
    -:    7:    else
    1:    8:        return true;
    -:    9:}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接