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

StackOverflow https://stackoverflow.com//questions/11703709

Вопрос

У меня есть проект 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 (установленного доморощенным) все работает нормально.

В 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?

Это было полезно?

Решение

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

./configure CXXFLAGS="--coverage"

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

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

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, тогда все работает на всех моих платформах.

РЕДАКТИРОВАТЬ:Смотрите также эта тема.

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top