Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用单独的构建目录使用CMake的gcov_C++_Cmake_Gcov - Fatal编程技术网

C++ 使用单独的构建目录使用CMake的gcov

C++ 使用单独的构建目录使用CMake的gcov,c++,cmake,gcov,C++,Cmake,Gcov,我正在努力获取gcov的覆盖信息。编译和链接期间没有错误,但当我运行可执行文件时,不会生成覆盖率数据 我将CMake与单独的构建目录一起使用,通过以下方式将标志传递给编译器和链接器: add_definitions(--coverage) set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS} " --coverage") 可执行文件是否期望源代码位于特定位置? 我必须向我的CMakeLists.txt添加什么才能使事情顺利进行 亲切问候,,

我正在努力获取gcov的覆盖信息。编译和链接期间没有错误,但当我运行可执行文件时,不会生成覆盖率数据

我将CMake与单独的构建目录一起使用,通过以下方式将标志传递给编译器和链接器:

add_definitions(--coverage)
set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS} " --coverage")
可执行文件是否期望源代码位于特定位置? 我必须向我的CMakeLists.txt添加什么才能使事情顺利进行

亲切问候,,
Bjoern

不确定您从哪里获得了
--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覆盖率创建 “gcov”所需的数据文件

-fprofile圆弧插入 基于arc的程序分析代码

您不需要将覆盖率传递给链接器--coverage将-fprofile arcs-ftest coverage传递给编译器,-lgcov传递给链接器

您确定它没有创建任何gcdo或gcda文件吗?你在哪里找这些文件?它应该将每个对象文件的gcov文件放在与对象文件相同的目录中。在生成目录的顶部查找.gcda文件。如果什么都没有出现,gcov可能就不会被联系进来。运行以下命令以查看它是否为:

nm name_of_binary | grep "gcov"

如果它被链接进来,那么gcov可能没有权限将文件写入运行可执行文件的位置。如果它有权限,那么我就被难住了。

CMake似乎将代码覆盖率(*.gcda,*.gcdo)文件与项目的目标文件放在一起。如果您的可执行文件名为“tester”,那么它们将出现在以下路径中

${CMAKE_BINARY_DIR}/CMakeFiles/tester.dir/
CMake似乎以一种与gcov不太兼容的方式命名源文件。例如,如果我有一个名为“mytestprog.cpp”的源文件,它将是build

mytestprog.cpp.o
mytestprog.cpp.gcda
mytestprog.cpp.gcdno
正如gcov所期待的那样

mytestprog.gcda
mytestprog.gcdno

我真的不知道如何修复它。我尝试过使用LCov,但“似乎”有效,但我不确定它是否有效。

Delcypher指出了问题所在

解决方案1:您可以要求
cmake
将对象文件命名为
main.o
,而不是
main.cpp.o
等。使用未记录的
cmake\u CXX\u OUTPUT\u EXTENSION\u 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
目录中找到覆盖率信息。

出于某种原因,您可以通过仅指定对象文件并将伪值传递为sourcefile来获取配置文件信息。例如:
gcov-o mytestprog.cpp.o x
将生成
mytestprog.cpp.gcov
@bcmpinc,但它将无法检查您在该文件中使用的标题。使用Clang时,
--coverage
以较短的格式执行这两个参数的操作。GCC支持
--coverage