"Скрытый символ" atexit "ссылается DSO" при использовании libtool с gcov

у меня есть проект C++, который использует GNU Autotools для своих сценариев сборки и libtool для связывания. Недавно я добавил инструментарий покрытия кода с gcov, гарантируя, что

GCOV_CFLAGS="-fprofile-arcs -ftest-coverage"
GCOV_LDFLAGS="-fprofile-arcs -ftest-coverage"

..получить включены в мой CFLAGS и LDFLAGS соответственно. В OS X 10.7.4 с помощью g++-4.2 (установлен homebrew) все работает нормально.

на Ubuntu 12.04 с помощью g++ 4.6.3 libtool не удается связать один из моих тестов:

/bin/bash ./libtool --tag=CXX   --mode=link g++ -Wall -Wextra -Werror -ansi -fprofile-arcs -ftest-coverage -g -O0 -fprofile-arcs -ftest-coverage -L/usr/local/lib -Wl,-rpath -Wl,/usr/local/lib   -o myproj/inttests/locale_test myproj/inttests/locale_test.o myproj/app/libapp.la -lboost_thread-mt -lboost_system-mt -pthread -llog4cplus  
libtool: link: g++ -Wall -Wextra -Werror -ansi -fprofile-arcs -ftest-coverage -g -O0 -fprofile-arcs -ftest-coverage -Wl,-rpath -Wl,/usr/local/lib -o myproj/inttests/.libs/locale_test myproj/inttests/locale_test.o -pthread  -L/usr/local/lib myproj/app/.libs/libapp.so -lboost_thread-mt -lboost_system-mt /usr/lib/liblog4cplus.so -pthread
/usr/bin/ld: myproj/inttests/.libs/locale_test: hidden symbol `atexit' in /usr/lib/x86_64-linux-gnu/libc_nonshared.a(atexit.oS) is referenced by DSO
/usr/bin/ld: final link failed: Bad value
collect2: ld returned 1 exit status
make[2]: *** [myproj/inttests/locale_test] Error 1

как исправить мою сборку на ubuntu / g++ 4.6?

2 ответов


после погуглив вокруг я вижу этой теме, что предполагает добавление --coverage to CXXFLAGS при работе ./configure. Действительно, хотя это не сработало для этого плаката, это работает для меня:

./configure CXXFLAGS="--coverage"

однако эта переменная зарезервирована для установщика пакетов, а не для сопровождающего (me.) Вопрос сводится к "Как правильно включить это в сборку?"

вот что не достаточно:

GCOV_CFLAGS="-fprofile-arcs -ftest-coverage --coverage"
GCOV_LDFLAGS="-fprofile-arcs -ftest-coverage"

на предположение, что GCOV_CFLAGS включается в эффективный CXXFLAGS (не показано, но это так), кажется, что это исправление должно работать. Это не так.

копая дальше, кажется, мы должны, по крайней мере, получить некоторую тягу, если мы упадем CXXFLAGS="--coverage" из командной строки и вместо этого поместите его в configure.ac куда-то. Это, собственно, и не работает если линия расположена над AC_PROG_CXX вызов, который выбирает компилятор.

Итак, теперь мы получаем немного понять. AC_PROG_CXX изменяет что-то, когда он видит --coverage, что очень вероятно, почему размещение в GCOV_CFLAGS не помогло: было слишком поздно.

внимательно просматривая журналы, кажется, что секретный соус-Это автоматическое включение -lgcov на этапе неудачной компоновки. Я не уверен, что эта библиотека должна быть такой секретной, но если я изменю свои переменные так:

GCOV_CFLAGS="-fprofile-arcs -ftest-coverage --coverage"
GCOV_LDFLAGS="-fprofile-arcs -ftest-coverage"
GCOV_LIBS="-lgcov"

..и обеспечить GCOV_LIBS входит в LIBS, тогда все работает, на всех моих платформы.

редактировать: см. также этой теме.


в более общем виде эта ошибка может быть исправлена, убедившись, что ваши библиотеки упорядочены правильно в командной строке link.