是否可以使用gcov对共享库进行代码覆盖?

man*_*mak 3 opencv gcov

我尝试测试使用OpenCV共享库的可执行文件.当使用gcov知道覆盖了哪些代码行时,我只获得有关我的.cpp文件和库的.hpp的信息.没有关于库的.cpp文件的信息.

我编译并链接-pg --coverage标志.

Tom*_*ing 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
Run Code Online (Sandbox Code Playgroud)

myexec.cpp:

#include "mylib.h"

int main(int argc, char** argv)
{
    return is_even(argc);
}
Run Code Online (Sandbox Code Playgroud)

mylib.h

#ifndef MYLIB_H
#define MYLIB_H

int is_even(int num);

#endif
Run Code Online (Sandbox Code Playgroud)

mylib.cpp

#include "mylib.h"

int is_even(int num)
{
    if (num % 2)
        return false;
    else
        return true;
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

我使用运行可执行文件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:}
Run Code Online (Sandbox Code Playgroud)