我正在使用gcov来生成一个生成子进程的c ++测试可执行文件。子进程包含一个共享对象库。测试进程,子进程和共享对象库都在不同的目录中编译。我使用-fprofile-arcs -ftest-coverage标志进行编译和链接。当我编译时,我得到子进程和共享库的.gcno文件。但是当我运行可执行文件时,我只能获得父进程的覆盖输出。
我的问题是,是否有任何特殊步骤可以通过共享库来覆盖此子进程?
gcc帮助论坛问题here(关于带共享对象库的gcov)解释了共享库必须与运行可执行文件的目录构建在同一目录中。
这是否意味着为了获得测试覆盖率,我必须在同一目录中编译每个组件(父测试进程,子进程和共享对象库)?
答案 0 :(得分:0)
以下是我为gcov工作所做的工作......
我在各自的目录中编译了共享对象库和两个可执行文件,并确保在编译和链接它们时使用这些标志(-fprofile-arcs -ftest-coverage)。事实证明这些二进制文件的位置并不重要。重要的是使用标志,允许gcc检测代码。
我将生成的.so和两个可执行文件复制到一个目录中。
然后我运行了测试可执行文件,它开始(分叉)链接到共享对象库的另一个(子)可执行文件。
作为运行可执行文件的结果,为每个.cpp生成了一个.gcno文件。每个.gcno文件都位于与其对应的.cpp文件相同的位置。
然后我在我希望代码覆盖的源文件上运行“gcov * .cpp”。
执行步骤5会为我运行gcov的每个.cpp生成一个.gcda文件。这些是显示代码覆盖率的实际文件。在您喜欢的编辑器中打开它们并查看。