gcc profile gcov

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



profile (8)

Estoy intentando compilar una aplicación simple con gcov y obtener los siguientes errores de enlace:

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

Parece que no puedo encontrar la ubicación de los símbolos faltantes. gcov está presente en la máquina ejecutando gcc versión 4.1.2

¿Algunas ideas? Gracias.

En Editar:

Todo parece funcionar bien cuando se usa gcov con una aplicación que consta de un archivo .c. Cuando tengo múltiples archivos .c (por lo tanto múltiples archivos .o) tengo el problema anterior.

Los pasos de compilación son los siguientes:

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


Acabo de pasar una increíble cantidad de tiempo depurando un error muy similar. Esto es lo que aprendí:

  • -fprofile-arcs -ftest-coverage pasar -fprofile-arcs -ftest-coverage al compilar.
  • Tienes que pasar -fprofile-arcs al enlazar.
  • Aún puede obtener errores de vinculador extraños al vincular. Se verán así:

    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 problemas con uno de los constructores generados por el compilador (en mi caso, un constructor de copias). Compruebe la función mencionada en el mensaje de error, vea qué tipos de objetos copia y construye, y vea si alguna de esas clases no tiene un constructor de copia. Agregue uno, y el error desaparecerá.

Editar: Si optimiza o no, también puede afectar esto. Intente encender / apagar las optimizaciones si tiene problemas con ella.


Así que agregué -ha compartido con CFLAGS, y ahora parece funcionar con múltiples archivos. Por supuesto, está sacando muestras en un lugar extraño, así que aún no sé de qué se trata.


Debería poder especificar solo --coverage en la línea de comando al compilar y vincular.

De acuerdo con el man gcc :

La opción es un sinónimo de -fprofile-arcs -ftest-coverage (al compilar) y -lgcov (al vincular).


Encontré, como se sugirió aquí , que agregar -lgcov a la línea de compilación al compilar una biblioteca compartida que contenga .o''s compilado con -fprofile-arcs -ftest-coverage lo resolvió por mí. Y, por supuesto, vincular el 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 así:

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

Agregar el -lgov a la compilación de la biblioteca compartida (no solo el exe) resolvió 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

Tenga en cuenta que -lgcov debe ser la última biblioteca vinculada.


Gran Max Lybbert, básicamente en caso de uso de autoconf agrega _LDADD = -lgcov ...

Esto resolverá el problema.


La bandera que está buscando es -lgcov al enlazar . Es decir, cambio:

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

a

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


Quizás, obviamente, este mensaje de error exacto se produce cuando se vincula con un enlazador que no es de gcc. Vemos este error al vincular con ifort (porque nuestro código incluye los módulos Fortran y C). Cambiar a la vinculación con gcc hizo el truco.


gcc -ftest-coverage -fprofile-arcs test.c un archivo de prueba simple con gcc -ftest-coverage -fprofile-arcs test.c y no tuve problemas como usted describe.

Sospecho que gcc trae la biblioteca de gcov si el -ftest-coverage está allí cuando está vinculando. Intenta pasar esa bandera en tu línea de comando de gcc.