我很难获得gcov的覆盖信息。编译和链接期间没有错误,但是当我运行可执行文件时,不会生成任何覆盖数据。
我正在使用带有单独构建目录的CMake,以这种方式将标志传递给编译器和链接器:
add_definitions(--coverage)
set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS} " --coverage")
可执行文件是否期望源代码位于特定位置? 我需要添加什么来添加到我的CMakeLists.txt才能完成任务?
亲切的问候, 比约恩
答案 0 :(得分:12)
CMake似乎将代码覆盖(* .gcda,* .gcdo)文件与项目的目标文件放在一起。如果您的可执行文件被命名为" tester"那么它们将出现在以下路径中
${CMAKE_BINARY_DIR}/CMakeFiles/tester.dir/
CMake似乎以一种与gcov非常兼容的方式命名源文件。例如,如果我有一个名为" mytestprog.cpp"的源文件。它将是构建
mytestprog.cpp.o
mytestprog.cpp.gcda
mytestprog.cpp.gcdno
gcov似乎期待
mytestprog.gcda
mytestprog.gcdno
我不确定如何修复它。我尝试过使用LCov而且#34;出现了#34;工作,但我不确定它是否确实。
答案 1 :(得分:8)
Delcypher指出了这个问题。
解决方案1:您可以要求cmake
使用未记录的main.o
开关将对象文件命名为main.cpp.o
而不是CMAKE_CXX_OUTPUT_EXTENSION_REPLACE
等:
cmake -DCMAKE_CXX_OUTPUT_EXTENSION_REPLACE=ON ...
解决方案2:如果您不需要.gcov
文件,可以从构建目录中调用lcov
:
lcov --capture --directory . --output-file coverage.info
genhtml coverage.info --output-directory out
您将在html表单的out
目录中找到覆盖率信息。
答案 2 :(得分:3)
不知道你从哪里得到--coverage
,但这些是我在Linux上用来获取使用gcc和gcov的覆盖信息的参数:
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs -ftest-coverage")
set(CMAKE_EXE_LINKER_FLAGS
"${CMAKE_EXE_LINKER_FLAGS} -fprofile-arcs -ftest-coverage")
以下是gcc --help --verbose
对这些选项的评价:
-ftest-coverage创建 “gcov”
所需的数据文件-fprofile-arcs Insert 基于弧的程序分析代码
答案 3 :(得分:0)
您无需将--coverage传递给链接器。 --coverage会将-fprofile-arcs -ftest-coverage传递给编译器,将-lgcov传递给链接器。
您确定它没有创建任何gcdo或gcda文件吗?你在哪里寻找这些文件?它应该将每个目标文件的gcov文件放在与目标文件相同的目录中。在构建目录的顶部找到.gcda文件。如果没有显示任何内容,gcov可能无法链接。运行以下命令以查看它是否:
nm name_of_binary | grep "gcov"
如果它被链接,那么gcov可能没有权限将文件写入运行可执行文件的位置。如果它有权限,那么我很难过。