47 votos

¿Dónde están los símbolos gcov?

Estoy tratando de compilar una aplicación sencilla con gcov y obteniendo el siguiente enlace errores:

gcc AllTests.o CuTestTest.o CuTest.o -o TestTest
AllTests.o: In function `global constructors keyed to 0_RunAllTests':
/home/p7539c/cutest/AllTests.c:26: undefined reference to `__gcov_init'
AllTests.o:(.data+0x44): undefined reference to `__gcov_merge_add'
CuTestTest.o: In function `global constructors keyed to 0_TestCuStringNew':
/home/p7539c/cutest/CuTestTest.c:30: undefined reference to `__gcov_init'
CuTestTest.o:(.data+0x64): undefined reference to `__gcov_merge_add'
CuTest.o: In function `global constructors keyed to 0_CuStrAlloc':
/home/p7539c/cutest/CuTest.c:379: undefined reference to `__gcov_init'
CuTest.o:(.data+0x184): undefined reference to `__gcov_merge_add'
collect2: ld returned 1 exit status
make: *** [TestTest] Error 1

Me parece que no puede encontrar la ubicación de los símbolos perdidos. gcov está presente en el equipo que ejecuta la versión de gcc 4.1.2

Alguna idea? Gracias.

En Editar:

Todo parece funcionar bien cuando el uso de gcov con una aplicación que consta de uno .c archivo. Cuando tengo varios .c archivos (por lo tanto múltiples .o archivos) tengo el problema de arriba.

La compilación de los pasos en el siguiente aspecto:

cc -fprofile-arcs -ftest-coverage -g   -c -o AllTests.o AllTests.c
cc -fprofile-arcs -ftest-coverage -g   -c -o CuTestTest.o CuTestTest.c
cc -fprofile-arcs -ftest-coverage -g   -c -o CuTest.o CuTest.c

60voto

slicedlime Puntos 1260

Acabo de pasar una increíble cantidad de tiempo de depuración muy semejante error. He aquí lo que he aprendido:

  • Usted tiene que pasar a -fprofile-arcs -ftest-coverage al compilar.
  • Usted tiene que pasar a -fprofile-arcs al vincular.
  • Usted todavía puede obtener extraño enlazador errores a la hora de ligar. Van a tener este aspecto:

    libname.a(objfile.o):(.ctors+0x0): undefined reference to 'global constructors keyed to long_name_of_file_and_function'

Esto significa que gconv está teniendo un problema con uno de sus generado por el compilador de constructores (en mi caso, un constructor de copia). Compruebe la función mencionada en el mensaje de error, consulte ¿qué tipos de objetos se copia construcciones, y ver si alguna de esas clases no tiene un constructor de copia. Agregar uno, y el error desaparecerá.

Edit: Si o no usted optimizar también puede afectar a este. Intente encender / apagar optimizaciones si usted está teniendo problemas con él.

12voto

Max Lybbert Puntos 11822

La bandera que estás buscando es - lgcov cuando se enlaza. Es decir, cambiar:

gcc AllTests.o CuTestTest.o CuTest.o -o TestTest

Para

gcc -lgcov AllTests.o CuTestTest.o CuTest.o -o TestTest

7voto

Oskari Timperi Puntos 111

Usted debe ser capaz de especificar sólo--cobertura en la línea de comandos cuando compilar y vincular. Debe hacer lo correcto, al menos según manual de GCC.

7voto

Ogre Psalm33 Puntos 4886

He encontrado, como aquí se sugiere, que la adición de-lgcov para la construcción de la línea cuando la construcción de una biblioteca compartida que contiene .o construido con-fprofile-arcos-ftest-cobertura de resolver esto por mí. Y, por supuesto, la vinculación de las ejecutable con-lgcov. Construyó la biblioteca compartida así:

g++    -shared -o libMyLib.so src_a.o src_b.o src_c.o -lgcov

Y el ejecutable de este modo:

g++ -o myExec myMain.o -lMyLib -lgcov

La adición de la lgov para la construcción de la biblioteca compartida (no sólo en el archivo exe), solucionado este error adicional para mí:

hidden symbol `__gcov_merge_add' in /usr/lib/gcc/x86_64-redhat-linux/4.1.2/libgcov.a(_gcov_merge_add.o) is referenced by DSO
/usr/bin/ld: final link failed: Nonrepresentable section on output

Por favor, tenga en cuenta que-lgcov debe ser la última biblioteca de enlaces.

5voto

flodin Puntos 2489

He probado un archivo simple prueba con gcc -ftest-coverage -fprofile-arcs test.c y no tuve problemas como describes.

Sospecho que gcc trae en la biblioteca de gcov si el -ftest-coverage bandera esté ahí cuando lo es vincular. Trate de pasar esa bandera en su línea de comando gcc.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: