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 может не иметь права на запись файлов туда, где вы запускаете исполняемый файл. Если у него есть разрешение, то я в тупике.