¿Cómo saber de dónde se incluye un archivo de encabezado?

97

¿Cómo puedo saber dónde g ++ pudo encontrar un archivo de inclusión? Básicamente si yo

#include <foo.h>

g ++ escaneará la ruta de búsqueda, usando cualquier opción de inclusión para agregar o alterar la ruta. Pero, al final de los días, ¿hay alguna manera de saber la ruta absoluta de foo.h que g ++ eligió compilar? Especialmente relevante si hay más de una foo.h en la miríada de rutas de búsqueda.

A falta de una forma de lograr eso ... ¿hay alguna manera de hacer que g ++ me diga cuál es su ruta de búsqueda final después de incluir los valores predeterminados y todas las opciones de inclusión?

harschware
fuente
1
Relacionado: ¿hay alguna forma de saber de qué archivo (s) de inclusión principal se incluyó un archivo de inclusión secundario? Es decir, para mostrar el gráfico desde incluido (Sugerencia: gcc -E no está del todo allí ... podría procesarse para generarlo).
Krazy Glew

Respuestas:

78

Esto le dará a make dependencias que enumeran rutas absolutas de archivos de inclusión:

gcc  -M showtime.c

Si no desea que el sistema incluya (es decir #include <something.h>), utilice:

gcc  -MM showtime.c
Sodved
fuente
18
Debe tenerse en cuenta que si usa junto con "-o myObj.o", la salida, no el binario compilado, entra en "myObj.o". -M tiene una -E implícita, por lo que la compilación no se realiza. En cambio, descubrí que -MD es una opción muy útil, realiza la compilación y coloca la salida en myObj.d en su lugar. Hacer un parámetro adecuado para simplemente anteponer a su línea de compilación sin efectos extraños como * .o ahora contiene la salida en lugar del binario. Gracias por tu ayuda.
harschware
Todas las opciones de gcc relacionadas se describen aquí .
Akhan
105
g++ -H ...

También imprimirá la ruta completa de los archivos de inclusión en un formato que muestra qué encabezado incluye qué

Bulletmagnet
fuente
7
Esto parece ser más útil que -M en mi experiencia. Me gusta la visualización jerárquica de qué incluye qué.
Brian Minton
Bien, es útil para depurar.
1
Esta es la mejor respuesta. Puede agregarlo a su proceso de compilación sin cambiar nada más.
Timmmm
4
Esto realmente responde a la pregunta más que a la respuesta aceptada. El único problema desafortunado es que no pude evitar que Clang intentara compilar el archivo normalmente, así que terminé usando clang++ -MM -H(que es una combinación un poco útil).
rookie1024
@ rookie1024 Úselo clang++ -H -fsyntax-only ...si desea evitar la generación de archivos de salida (también funciona gcc).
Lekensteyn
8

Uso seguro

g++ -E -dI  ... (whatever the original command arguments were)
Wallyk
fuente
2
Esta solución tiene varios beneficios: 1. Puede descubrir múltiples inclusiones de un solo archivo de encabezado (-H y -M imprimen cada archivo incluido solo una vez) 2. Puede ver dónde está incluido (nombre y número de línea del original incluir instrucción). (!) 3. De este modo se puede fiable distinguir si una cabecera se incluye directamente o indirectamente, o ambos (Esto es importante para las limpiezas.)
hagello
5

Si usa -MMo una de las opciones relacionadas ( -M, etc.), obtiene solo la lista de encabezados que se incluyen sin tener todos los demás resultados del preprocesador (que parece obtener con la g++ -E -dIsolución sugerida ).

Jonathan Leffler
fuente
g++ -MM t.ccno muestra ninguna inclusión, solo t.o: t.cc. ¿Necesita algo más?
wallyk
3
Agradable: para completar, puede obtener algo similar con MSVC usando la /showIncludesopción. MSVC incluso sangrará para mostrarle el anidamiento de los encabezados (no veo eso -Men GCC).
Michael Burr