gcov未生成所有的gcda文件

4
我已经尝试了很多解决方案,但都没有起作用。我正在为一个项目编写新代码,但是这段代码被很多硕士和博士修改过,他们并不在意代码的可读性。因此,有很多东西是无用的,甚至未被使用。
然后我听说了gcov和lcov,但是在我生成.info文件并加载到lcov html之后,除了跟踪主文件之外,它只追踪了我的所有文件!即使知道其他许多函数和文件被使用!
(非常抱歉我的英语不好,我来自巴西亚马逊州的马瑙斯,不是一个好的英语演讲者!但是我已经寻找了一个月的答案,尝试了很多方法,但完全没有运气)。
我的文件看起来像:
    -src/
       -core/
         -Index.cpp/h
         -PostingList.cpp/h
         -PreProcessor.cpp/h
       -methods/
         ...
       -parser/
         ...
       -run/
         ...
       -structures/
         ...
       -utils/
         ...

我在项目源代码目录下找到了一个名为CMakeFile.txt的文件,内容如下:

   cmake_minimum_required (VERSION 2.4)
   project (queryProcessor)

   include("${${PROJECT_NAME}_SOURCE_DIR}/globalVariables.cmake")

   include_directories(${INCLUDES})

   link_directories(${LIBS})

   if(COMMAND cmake_policy)
     cmake_policy(SET CMP0003 NEW)
   endif(COMMAND cmake_policy)

   add_subdirectory(src)

   add_executable(QueryProcessor src/run/queryProcessor.cpp)
   target_link_libraries (QueryProcessor libQueryProcessor rt -fprofile-arcs)

   add_definitions(-O2 )

还有一个在src目录下的文件,看起来像这样:

   aux_source_directory( utils UTILS )
   aux_source_directory( parser PARSER )
   aux_source_directory( methods METHODS )
   aux_source_directory( structures STRUCTURES )
   aux_source_directory( core CORE )
   aux_source_directory( . SRC )
   aux_source_directory( ../../libs-iw/indexer/include UTILS2 )

   add_library( libQueryProcessor ${UTILS} ${UTILS2} ${SRC} ${PARSER} ${METHODS} ${STRUCTURES} ${CORE})

   set(CMAKE_CXX_FLAGS "--coverage")

   include ( ${${PROJECT_NAME}_SOURCE_DIR}/install.cmake )

非常感谢您的帮助,包括提供更好的CMakeFiles建议。提前致谢。


libQueryProcessor对象文件是否已经使用正确的标志编译?使用make clean; make VERBOSE=1切换到详细模式,并仔细检查编译器和链接器调用标志。 - user3159253
此外,在定义新目标或添加子目录之前,将所有编译标志操作移动到前面是明智的。 - user3159253
感谢@user3159253!已经移动了标志操作并仔细阅读了详细输出。从一个文件到另一个文件的唯一区别是在链接CXX可执行文件时它有一个-fprofile-arcs参数,这是每个cpp都需要有的吗? - thomaz andrade
1
@thomazandrade 你应该尝试一下pt.stackoverflow.com。它是用葡萄牙语(em Português)编写的。虽然你的英语不错,但我想你在那里可能会更舒适 :) - Laurel
1个回答

1

抱歉耽搁了。

为了使用gcov,您需要使用适当的选项编译程序中的每个源文件。 文档 中提到了-fprofile-args -ftest-coverage,但您可能还想使用与分析相关的其他选项。

因此,您需要像如何在cmake文件中添加链接器或编译器标志?建议的那样,在所有目标定义之前(即主要CMakeLists.txt的开头附近的某个位置)添加这些标志。您可能希望添加一个CMake选项来一次性控制这些标志:

option(USE_GCOV "Create a GCov-enabled build." OFF)
...
if (USE_GCOV)
  set(GCC_COVERAGE_COMPILE_FLAGS "-fprofile-arcs -ftest-coverage")
  set(GCC_COVERAGE_LINK_FLAGS    "-lgcov")
endif()
set( CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}" )
set( CMAKE_EXE_LINKER_FLAGS  "${CMAKE_EXE_LINKER_FLAGS} ${GCC_COVERAGE_LINK_FLAGS}" )
...
add_subdirectory(...)
add_library(....)
add_executable(....)

非常感谢!现在它像魔法一样运行,唯一的问题是它在很多不同的文件夹中生成.gcda文件,但我现在会寻找解决方案!再次感谢!祝你有一个愉快的一周。 - thomaz andrade
根据您的需要,可能会有各种解决方案。您可以编写一个shell脚本来收集它们,或者尝试重新组织对象文件的创建位置。您只需要更准确地阐述您的需求并提出适当的问题即可 ;) - user3159253

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