Как устранить проблему __gcov_init undefined, когда ссылка
Теперь я работаю над исследованием покрытия кода C и столкнулся с следующей проблемой, GCC версии 4.4.6:
- Добавлен флаг компилятора
CFLAGS = --coverage
и вариант компоновщика LDFLAGS := --coverage
или LOCAL_LDLIBS := --coverage
и получил ошибку:
undefined reference to '__gcov_init'" and "undefined reference to '__gcov_merge_add'
- Добавлена опция
LOCAL_LDFLAGS := --coverage
и получена ошибка связи:
libgcov.a(_gcov.o): in function __gcov_set_sampling_rate: undefined reference to '__gcov_sampling_rate'
libgcov.a(_gcov.o): in function gcov_exit: undefined reference to '__gcov_pmu_profile_filename'
libgcov.a(_gcov.o): in function __gcov_init: undefined reference to '__gcov_pmu_profile_options' '__gcov_pmu_top_n_address'
Может кто-нибудь помочь в некоторых предложениях по этой проблеме?
Ответы
Ответ 1
Попробуйте этот подход:
Скомпилируйте код, для которого вы хотите создать покрытие с помощью следующих опций:
CFLAGS: -fprofile-arcs -ftest-coverage
LFLAGS: -lgcov --coverage
Если это не решит проблему, пожалуйста, предоставьте некоторую информацию о структуре вашего приложения, то есть ли ее отдельная программа или приложение с участием общих/статических библиотек и т.д.
Надеюсь, что это поможет!
Ответ 2
Вы связываетесь с -lgcov?
Если вы используете Makefile, было бы очень полезно взглянуть на него, чтобы помочь вам.
Ответ 3
Я не могу быть уверен, какое изменение, наконец, сделало трюк для меня, но я думаю, что это был флаг -fprofile-generate
. Используя GNAT GPS, я перешел на вкладку Switches
слева, а затем выбрал вкладку Ada Linker
вверху. Затем я включил флажок для Code Coverage
. О, да, я обнаружил, что на вкладке Builder
в этой же области, если вы включите флажок Recompile if switches changed
, он может сэкономить много скрежет зубов. Наверное, замедляет работу профессионалов, но я счел это полезным.