Запустить инструмент gcov с помощью компилятора c ++

Я впервые работаю с инструментом покрытия gcov для анализа большого проекта. У меня есть такая структура каталогов:

    HW
     -FooHW1.cpp
     -FooHW1.h
     -FooHW2.cpp
     -FooHW2.h
     -...
     -Makefile.am
    Lib1
     -FooLib1.cpp
     -FooLib1.h
     -FooLib2.cpp
     -FooLib2.h
     -...
     -Makefile.am

    Lib2
     ...
     -Makefile.am
    Lib3
     ...
     -Makefile.am
    Main
     -main.cpp
     -main.h
     -Makefile.am

Каждый каталог имеет свой собственный Makefile, созданный с помощью automake для генерации зависимостей, и все, что используется компилятором, - это c ++.

Поскольку моей целью является анализ покрытия операторов, я попытался использовать gcov, добавив следующие строки в каждый файл Makefile.am для создания моих файлов .gcno и .gcda для использования gcov:

    AM_CXXFLAGS = -fprofile-arcs -ftest-coverage
    AM_LDFLAGS = -fprofile-arcs

К сожалению, даже если он компилируется, он не создает (или не связывает) несколько * .o и при вызове gcov обычно выдает ошибку:

    undefined __gcov_init

Я также пробовал подозревать, в соответствии с http://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html#index-coverage-536, верхние инструкции:

    AM_CXXFLAGS = --coverage
    AM_LDFLAGS = --coverage

но мне это не помогает.

Хочу указать, что это первый опыт работы с инструментом gcov и с большими проектами на c ++. Спасибо за вашу помощь.


person gRomano    schedule 05.08.2013    source источник
comment
Думаю, вы забыли связать свой код с lcov.   -  person πάντα ῥεῖ    schedule 05.08.2013
comment
Разве lcov - это не просто графический интерфейс для инструмента gcov? Я действительно неопытен, поэтому не понимаю вашего предложения, не могли бы вы пояснить? Благодарность!   -  person gRomano    schedule 05.08.2013
comment
Да, возможно, я запутался. AM_LDFLAGS = --coverage должен делать то, что я имел в виду.   -  person πάντα ῥεῖ    schedule 05.08.2013
comment
Я добавил следующее в Makefile.am: AM_CXXFLAGS = --coverage AM_LDFLAGS = --coverage AM_CFLAGS = -shared, и он, наконец, создает файлы * gcno, я не мог проверить общую причину, у меня были другие проблемы, надеюсь, это сработает. Спасибо!   -  person gRomano    schedule 05.08.2013
comment
Вы можете изучить до make VERBOSE=1 и просмотреть флаги связи   -  person prehistoricpenguin    schedule 15.04.2021


Ответы (2)


http://bobah.net/d4d/tools/code-coverage-with-gcov и http://www.slideshare.net/maguschen/using-gcov-and-lcov - хорошие источники для использования gcov / lcov (с этой помощью мне удалось использовать lcov в действительно большом и сложном проекте)

lcov дает вам возможность отображать результаты покрытия в формате html (хорошие проценты для перечисленных файлов или даже для строк в исходных файлах).

О, и я надеюсь, вы понимаете, что это динамическое покрытие, поэтому вам нужно фактически запустить программу, чтобы получить какое-либо покрытие (сборка должна создавать только .gcno файлы).

person zoska    schedule 05.08.2013
comment
спасибо, я знаю, что мне нужно запустить его, чтобы получить покрытие (на самом деле это цель моего проекта - протестировать какой-то модуль мобильного робота)! взглянул на вывод lcov, и на самом деле он намного приятнее и понятнее, чем вывод gcov, поэтому я постараюсь использовать его, как только я смогу заставить его работать, единственная разница должна быть при его вызове, я прав? lcov вместо gcov Спасибо! - person gRomano; 05.08.2013

связать библиотеку gocv

-lgcov

это должно помочь

person kaps    schedule 20.08.2018