2011-05-22 12 views
11

Tengo dificultades para obtener información de cobertura para gcov. No hay errores durante la compilación y el enlace, pero cuando ejecuto el archivo ejecutable, no se generan datos de cobertura.gcov con CMake utilizando un directorio de compilación independiente

estoy usando CMake con un directorio de construcción separada, pasando banderas para el compilador y el enlazador de esta manera:

add_definitions(--coverage) 
set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS} " --coverage") 

¿El ejecutable esperan que el código fuente esté en un lugar específico? ¿Qué debo agregar a mi CMakeLists.txt para que todo funcione?

Saludos cordiales, Bjoern

Respuesta

3

No está seguro de dónde sacó --coverage partir, pero estos son los argumentos que uso en Linux para obtener información de cobertura usando gcc y gcov:

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs -ftest-coverage") 
set(CMAKE_EXE_LINKER_FLAGS 
    "${CMAKE_EXE_LINKER_FLAGS} -fprofile-arcs -ftest-coverage") 

Esto es lo que gcc --help --verbose tiene para decir acerca de esas opciones:

-ftest-coverage Crear archivos de datos necesarios para "gcov"

-fprofile-arcos Insertar a base de perfiles de arco código del programa

+2

Al usar Clang, '--coverage' hace lo que esos dos argumentos hacen en un formato más corto. – jackyalcine

+0

GCC admite '--coverage' https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html – mloskot

0

No es necesario pasar --coverage al enlazador. --coverage pasará -fprofile-arcs -ftest-coverage al compilador y -lgcov al enlazador.

¿Está seguro de que no está creando ningún archivo gcdo o gcda? ¿Dónde estás buscando estos archivos? Debe colocar el archivo gcov para cada archivo de objeto en el mismo directorio que el archivo objeto. Haga una búsqueda de archivos .gcda en la parte superior de su directorio de compilación. Si no aparece nada, gcov podría no estar recibiendo vinculado en Ejecute el siguiente comando para ver si es:.

nm name_of_binary | grep "gcov" 

Si se está haciendo en el mismo, a continuación, gcov que no tenga permiso para escribir archivos en donde se encuentre ejecutando el ejecutable. Si tiene permiso, entonces estoy perplejo.

12

CMake parece poner los archivos de cobertura de código (* .gcda, * .gcdo) con los archivos objeto de su proyecto. Si el ejecutable fue nombrado "probador", entonces aparecerían en la siguiente ruta

${CMAKE_BINARY_DIR}/CMakeFiles/tester.dir/ 

CMake parece el nombre de los archivos de origen de una manera que no es muy compatible con gcov sin embargo. Por ejemplo, si tuviera un archivo fuente llamada "mytestprog.cpp" sería construir

mytestprog.cpp.o 
mytestprog.cpp.gcda 
mytestprog.cpp.gcdno 

donde como gcov parece esperar

mytestprog.gcda 
mytestprog.gcdno 

No estoy realmente seguro de cómo solucionarlo. Intenté usar LCov en su lugar y eso "pareció" funcionar, pero no estoy muy seguro de que así sea.

+1

por alguna razón, puede obtener información de perfil especificando solo los archivos de objetos y pasando un valor falso como archivo de origen. Por ejemplo: 'gcov -o mytestprog.cpp.o x' producirá' mytestprog.cpp.gcov'. – bcmpinc

+0

@bcmpinc Aunque no podrá verificar los encabezados que usó en ese archivo. – jackyalcine

8

Delcypher señaló el problema.

Solución 1: se puede pedir cmake para nombrar archivos de objetos como main.o en lugar de main.cpp.o etc., utilizando los indocumentados CMAKE_CXX_OUTPUT_EXTENSION_REPLACE interruptor:

cmake -DCMAKE_CXX_OUTPUT_EXTENSION_REPLACE=ON ... 

Solución 2: si no necesita los archivos .gcov Puede llamar al lcov desde el directorio de compilación:

lcov --capture --directory . --output-file coverage.info 
genhtml coverage.info --output-directory out 

Encontrará la información de cobertura en el directorio out en formato html.

Cuestiones relacionadas