¿Cuáles son los directorios de inclusión predeterminados de GCC?


131

Cuando compilo un archivo fuente muy simple con gcc, no tengo que especificar la ruta a los archivos de inclusión estándar como stdio o stdlib.

¿Cómo sabe GCC cómo encontrar estos archivos?

¿Tiene la /usr/includeruta cableada en su interior o obtendrá las rutas de otros componentes del sistema operativo?

Respuestas:


188

Para descubrir las rutas predeterminadas utilizadas por gcc/ g++, así como sus prioridades, debe examinar la salida de los siguientes comandos:

  1. Para C :
    gcc -xc -E -v -
  1. Para C ++ :
    gcc -xc++ -E -v -

El crédito va al equipo de Qt Creator .


55
cpp -v /dev/null -o /dev/null
Nehal J Wani

36

Hay un comando con una salida más corta, que permite cortar automáticamente los parches de inclusión de las líneas, comenzando con un solo espacio:

$ echo | gcc -Wp,-v -x c++ - -fsyntax-only
ignoring nonexistent directory "/usr/lib/gcc/x86_64-redhat-linux/4.8.2/include-fixed"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-redhat-linux/4.8.2/../../../../x86_64-redhat-linux/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/x86_64-redhat-linux/4.8.2/../../../../include/c++/4.8.2
 /usr/lib/gcc/x86_64-redhat-linux/4.8.2/../../../../include/c++/4.8.2/x86_64-redhat-linux
 /usr/lib/gcc/x86_64-redhat-linux/4.8.2/../../../../include/c++/4.8.2/backward
 /usr/lib/gcc/x86_64-redhat-linux/4.8.2/include
 /usr/local/include
 /usr/include
End of search list.

El crédito va a la portada de libc ++ .


1

Aunque estoy de acuerdo con la respuesta de Ihor Kaharlichenko para considerar C ++ y con la respuesta de abyss.7 para la compacidad de su salida, todavía están incompletas para las versiones de múltiples arcos de gcc porque el procesamiento de entrada depende de los parámetros y macros de la línea de comandos.

Ejemplo:

echo | /opt/gcc-arm-none-eabi-9-2019-q4-major/bin/arm-none-eabi-g++ -specs=nano.specs -mcpu=cortex-m4 -march=armv7e-m -mthumb -mfloat-abi=soft -x c++ -E -Wp,-v\ - -fsyntax-only rendimientos


/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../arm-none-eabi/include/newlib-nano                                                                                                              
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/include/c++/9.2.1                                                                        
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/include/c++/9.2.1/arm-none-eabi/thumb/v7e-m/nofp                                         
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/include/c++/9.2.1/backward                                                               
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/include                                                                                                            
 /opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/include-fixed                                                                                                      
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/include                                                                                  

mientras que los echo | /opt/gcc-arm-none-eabi-9-2019-q4-major/bin/arm-none-eabi-g++ -x c++ -E -Wp,-v - -fsyntax-onlyrendimientos


/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/include/c++/9.2.1                                                                        
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/include/c++/9.2.1/arm-none-eabi                                                          
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/include/c++/9.2.1/backward                                                               
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/include                                                                                                            
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/include-fixed                                                                                                      
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/include                                                                                  

La primera invocación utiliza newlib(ver líneas 1 y 3 de la salida), la segunda va con el estándar incluye. Los archivos comunes al final de la lista son un ejemplo para el uso de include_next.

En pocas palabras: considere siempre todas las macros y opciones de compilación al imprimir los directorios de inclusión.


1

Simplemente ejecute lo siguiente para enumerar las rutas de búsqueda predeterminadas:

$(gcc -print-prog-name=cc1) -v

Esto no enumera las rutas de inclusión. Solo ruta de programas y ruta de bibliotecas
kayahr

cc1por lo general, no se puede llamar directamente porque es un comando interno que no está en la RUTA. Tal vez desee editar su respuesta para describir dónde encontrar el archivo.
kayahr
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.