"На скрытый символ`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
в 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
Тогда все работает на всех моих платформах.
РЕДАКТИРОВАТЬ: Смотрите также эту тему.
В более общем смысле, эту ошибку можно исправить, убедившись, что ваши библиотеки упорядочены правильно в командной строке вашей ссылки.