【问题标题】:gcov not generating all gcda filesgcov 未生成所有 gcda 文件
【发布时间】:2016-08-25 08:17:39
【问题描述】:

我已经尝试了很多我创建的解决方案,但都没有奏效。我正在为一个项目编写一个新代码,但是这个代码被很多不关心使其可读的硕士和博士学位所触及。所以确实有很多东西没有用,甚至没有用。

然后我开始讨论 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!现在已经移动标志操作并仔细阅读详细输出。一个文件到另一个文件的唯一区别是在链接 CXX 可执行文件时,它有一个 -fprofile-arcs 参数,这是每个 cpp 都需要的参数吗?
  • @thomazandrade 你应该试试pt.stackoverflow.com。它是葡萄牙语(em Português)。你的英语还不错,但我想你在那里可能会更舒服:)

标签: c++ cmake gcov


【解决方案1】:

抱歉耽搁了。

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

所以您需要在所有目标定义之前附加How to add linker or compile flag in cmake file? 中建议的那些标志(即靠近主要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 文件,但我现在会寻找解决方案!再次感谢!!祝您度过愉快的一周
  • 根据您的需要,可能会有各种解决方案。您可以编写一个 shell 脚本来 -rule- 将它们全部收集起来,或者您可以尝试重新构建目标文件的创建位置。您只需要更准确地制定您的需求并提出适当的问题;)
猜你喜欢
  • 2012-04-18
  • 2020-12-01
  • 2011-06-06
  • 2011-04-12
  • 2016-04-09
  • 2014-07-18
  • 2012-09-25
  • 2012-07-07
相关资源
最近更新 更多