2012-07-28 12 views
10

Tengo un proyecto C++ que utiliza las herramientas automáticas GNU para sus scripts de compilación y libtool para vincular. Recientemente he añadido el código de cubierta con la instrumentación gcov, asegurando que"DSO hace referencia al símbolo oculto 'atexit' cuando se utiliza libtool con gcov

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

..get incluido en mi CFLAGS y LDFLAGS respectivamente. En OS X 10.7.4 usando g ++ - 4.2 (instalado por homebrew), todo funciona bien.

En Ubuntu 12.04 usando g ++ 4.6.3, libtool no se puede vincular una de mis pruebas:

/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 

¿Cómo arreglo mi construcción en ubuntu/g ++ 4.6?

Respuesta

5

Después de buscar en Google veo this thread, lo que sugiere agregar --coverage al CXXFLAGS al ejecutar ./configure. De hecho, a pesar de que no funcionó para ese cartel, que funciona para mí:

./configure CXXFLAGS="--coverage" 

Sin embargo esta variable está reservada para el instalador del paquete, no el mantenedor (. Me) La cuestión se reduce a "¿Cómo incorporo esto en la construcción correctamente? "

Esto es lo que no es suficiente:

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

En el supuesto de que GCOV_CFLAGS vaya a incluirse en el CXXFLAGS efectiva (que no se muestra, pero lo hace), parece que esta revisión debe trabajar. No es así

Profundizando, parece que al menos deberíamos obtener algo de tracción si dejamos caer CXXFLAGS="--coverage" desde la línea de comandos y en su lugar lo colocamos en configure.ac en alguna parte. Esto, en realidad, tampoco funcionó a menos que la línea se coloque por encima de la llamada AC_PROG_CXX que selecciona el compilador.

Así que ahora obtenemos un poco de información. AC_PROG_CXX está alterando algo cuando ve --coverage, lo cual es muy probable por qué la ubicación en GCOV_CFLAGS no funcionó: ya era demasiado tarde.

Mirando cuidadosamente a través de los registros, parece que la salsa secreta es la inclusión automática de -lgcov en el paso de enlace anómalo. No estoy seguro de esta biblioteca se necesita para ser un secreto, pero si cambio de las variables como tan:

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

..y aseguro GCOV_LIBS está incluido en LIBS, a continuación, funciona todo, en todos mis plataformas.

EDIT: vea también this thread.

+0

¿Trabaja manualmente estas variables GCOV * en otras variables o se incluyen automáticamente? Si los colocas de forma manual en otros, ¿en qué los colocas? – dbeer

+0

En realidad, parece que la versión actual de mis scripts hace una tercera cosa. Eche un vistazo a https://github.com/phs/sauce/blob/master/Makefile.am (vea 'configure.ac' para' GCOV_ENABLED') – phs

+1

Este comentario lo trajo el Departamento del Departamento de Redundancia. '--coverage' es el equivalente de' -fprofile-arcs -ftest-coverage' al compilar y '-lgcov' durante el enlace. – Bulletmagnet

0

De una manera más genérica, este error se puede solucionar asegurándose de que sus bibliotecas estén ordenadas correctamente en su línea de comandos de enlace.

Cuestiones relacionadas