GCOV с CMake, используя отдельный каталог сборки - PullRequest
11 голосов
/ 22 мая 2011

Я изо всех сил пытаюсь получить информацию о покрытии для gcov.Нет ошибок во время компиляции и компоновки, но когда я запускаю исполняемый файл, данные покрытия не создаются.

Я использую CMake с отдельным каталогом сборки, передавая флаги компилятору и компоновщику следующим образом:

add_definitions(--coverage)
set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS} " --coverage")

Ожидает ли исполняемый файл, что исходный код находится в определенном месте?Что мне нужно добавить в мой CMakeLists.txt, чтобы все заработало?

С уважением, Bjoern

Ответы [ 4 ]

12 голосов
/ 23 февраля 2012

CMake, кажется, помещает файлы покрытия кода (* .gcda, * .gcdo) в объектные файлы вашего проекта. Если ваш исполняемый файл был назван «тестер», он будет отображаться по следующему пути

${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, и это «показалось» сработало, но я не совсем уверен, что это так.

8 голосов
/ 18 октября 2016

Делсифер указал на проблему.

Решение 1: вы можете попросить cmake назвать объектные файлы как main.o вместо main.cpp.o и т. Д., Используя недокументированный CMAKE_CXX_OUTPUT_EXTENSION_REPLACE switch:

cmake -DCMAKE_CXX_OUTPUT_EXTENSION_REPLACE=ON ...

Решение 2: если вам не нужны файлы .gcov, которые можно вызвать lcov из каталога сборки:

lcov --capture --directory . --output-file coverage.info
genhtml coverage.info --output-directory out

Вы найдете информацию о покрытии в каталоге out в виде html.

3 голосов
/ 22 мая 2011

Не знаю, откуда вы взяли --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-arcs Вставить код профилирования программы на основе дуги

0 голосов
/ 23 мая 2011

Вам не нужно передавать --coverage компоновщику.--coverage передаст -fprofile-arcs -ftest-покрытие компилятору и -lgcov компоновщику.

Вы уверены, что он не создает файлы gcdo или gcda?Где вы ищете эти файлы?Он должен поместить файл gcov для каждого объектного файла в тот же каталог, что и объектный файл.Сделайте поиск для файлов .gcda в верхней части вашего каталога сборки.Если ничего не отображается, возможно, gcov не может быть подключен. Запустите следующую команду, чтобы проверить, является ли это:

nm name_of_binary | grep "gcov"

Если он получает ссылку, то gcov может не иметь разрешения записывать файлы туда, гдевы запускаете исполняемый файл.Если у него есть разрешение, то я в тупике.

...