Gcov с CMake, используя отдельный каталог сборки

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

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

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

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

С уважением, Бьорн

Ответ 1

Кажется, что 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 вместо этого, и это "появилось" для работы, но я не уверен, что это произошло.

Ответ 2

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

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

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

Ответ 4

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

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

nm name_of_binary | grep "gcov"

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