Я решил использовать такую настройку, чтобы имитировать работу проекта построен на системе CI.
Проект состоит из тестового исполняемого файла E (он использует фреймворк GoogleTest) и двух статических библиотек. , L1 и L2, имеющие следующие зависимости: L1 -> L2; L1, L2 -> E.
Он собирается с использованием системы CMake.
При сборке для покрытия кода в самом начале всего процесса я добавляю все нацелены на следующие флаги компилятора (
Код: Выделить всё
CMAKE_CXX_FLAGS
Затем я создаю отчет о покрытии кода, используя следующую команду:):): р>
Код: Выделить всё
-- C:/msys64/mingw64/bin/gcovr.exe --html index.html --html-details -r
--object-directory= --gcov-executable=llvm-cov gcov --merge-mode-functions=merge-use-line-min --exclude-unreachable-branches --exclude-function-lines --exclude-lines-by-pattern '^\s*\}?\s*$'
Однако , полученный отчет — мусор. В частности, многочисленные пустые строки, а также строки, содержащие только комментарии/закрывающие скобки, помечаются как «не попадающие», что делает вывод бесполезным.
Обратите внимание, что я использовал --exclude-lines-by-pattern '^\s*\}?\s*$', но по каким-то причинам он не отфильтровал упомянутые проблемные строки.
Вот отрывок из созданный отчет:

Что мне следует сделать? сделать, чтобы результаты были более точными? Использовать разные флаги компилятора/компоновщика? Другой инструмент покрытия?
Другой набор инструментов — не такое уж осуществимое решение, так как тогда мне пришлось бы постоянно перестраивать весь проект, чтобы переключаться между, например, Clang GCC.
Я пытался добавить флаги компилятора -Xclang -fprofile-instrument=clang ко всем целям сборки, но затем процесс сборки застрял на связывание моего тестового исполняемого файла E (или процесс замедлился, и я предположил, что он устарел; вместо завершения, скажем, за 10-20 секунд, он не завершился даже через несколько минут).
[РЕДАКТИРОВАНИЕ: оно завершилось примерно через 15-20 минут, с длинным списком ошибок «неопределенной ссылки», возникших в библиотеке GoogleTest (libgtest.a) и связанных с элементами. стандартной библиотеки C++, например:
Код: Выделить всё
C:/msys64/mingw64/bin/ld: lib/libgtest.a(gtest-all.cc.obj):C:/msys64/mingw64/include/c++/14.2.0/bits/stl_tree.h:1964: more undefined references to '__profc__ZNKSt8_Rb_treeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES5_St9_IdentityIS5_ESt4lessIS5_ESaIS5_EE14_M_lower_boundEPKSt13_Rb_tree_nodeIS5_EPKSt18_Rb_tree_node_baseRKS5_' follow
Подробнее здесь: https://stackoverflow.com/questions/791 ... -clang-pro