"Hidden símbolo `atexit' é referenciado por DSO" quando usando o libtool com gcov
Pergunta
Eu tenho um projeto de C++ que usa o GNU autotools da para seus scripts de compilação e libtool para a vinculação.Recentemente eu adicionei a cobertura de código de instrumentação com gcov, garantindo que
GCOV_CFLAGS="-fprofile-arcs -ftest-coverage"
GCOV_LDFLAGS="-fprofile-arcs -ftest-coverage"
..são incluídos na minha CFLAGS
e LDFLAGS
respectivamente.No OS X 10.7.4 usando g++-4.2 (instalado pelo homebrew), tudo funciona bem.
No Ubuntu 12.04 usando g++ 4.6.3, libtool falha de ligação de um dos meus testes:
/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
Como faço para corrigir meu construir no ubuntu/g++ 4.6?
Solução
Depois pesquisando em torno de eu ver esta thread, o que sugere a adição de --coverage
para CXXFLAGS
quando em execução ./configure
.De fato, apesar de não trabalhar para o pôster, que funciona para mim:
./configure CXXFLAGS="--coverage"
No entanto, esta variável é reservado para o instalador do pacote, não é o mantenedor (mim.) A questão se reduz a "Como faço para incorporar a construir corretamente?"
Aqui está o que é não o suficiente:
GCOV_CFLAGS="-fprofile-arcs -ftest-coverage --coverage"
GCOV_LDFLAGS="-fprofile-arcs -ftest-coverage"
No pressuposto de que GCOV_CFLAGS
será incluído no efectivo CXXFLAGS
(não é mostrado, mas é), parece que essa correção deve funcionar.Não.
Cavando mais, parece que pelo menos ganhar alguma tração em caso de cair CXXFLAGS="--coverage"
a partir da linha de comandos e, em vez de colocá-lo em configure.ac
em algum lugar.Este, na verdade, também não funcionou a menos que a linha é colocado acima da AC_PROG_CXX
chamada que seleciona o compilador.
Então, agora nós ganhamos um pouco de visão. AC_PROG_CXX
é alterar alguma coisa quando vê --coverage
, o que é muito provável por que a colocação em GCOV_CFLAGS
não funcionou:era tarde demais.
Olhando atentamente através dos logs, parece que o molho secreto é a inclusão automática de -lgcov
em falha da ligação etapa.Não tenho certeza de que esta biblioteca necessária para ser um segredo, mas se eu mudar o meu variáveis como:
GCOV_CFLAGS="-fprofile-arcs -ftest-coverage --coverage"
GCOV_LDFLAGS="-fprofile-arcs -ftest-coverage"
GCOV_LIBS="-lgcov"
..e garantir GCOV_LIBS
está incluído no LIBS
, e , em seguida, tudo funciona, em todos os meus plataformas.
EDITAR:Veja também esta thread.
Outras dicas
De uma forma mais genérica, este erro pode ser corrigido, certificando-se de suas bibliotecas são ordenados corretamente na linha de comando link.