Quais são os diretórios de inclusão padrão do GCC?


131

Ao compilar um arquivo de origem muito simples com o gcc, não preciso especificar o caminho para os arquivos de inclusão padrão, como stdio ou stdlib.

Como o GCC sabe como encontrar esses arquivos?

Possui o /usr/includecaminho conectado por dentro ou obtém os caminhos de outros componentes do SO?

Respostas:


188

Para descobrir os caminhos padrão usados ​​por gcc/ g++, bem como suas prioridades, você precisa examinar a saída dos seguintes comandos:

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

O crédito vai para a equipe do Qt Creator .


5
cpp -v /dev/null -o /dev/null
precisa

36

Existe um comando com uma saída mais curta, que permite cortar automaticamente os caminhos de inclusão das linhas, começando com um único espaço:

$ 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.

O crédito vai para a primeira página da libc ++ .


1

Embora eu concorde com a resposta de Ihor Kaharlichenko por considerar C ++ e com a resposta de abyss.7 pela compacidade de sua saída, eles ainda estão incompletos para as versões multi-arch do gcc porque o processamento de entrada depende dos parâmetros e macros da linha de comando.

Exemplo:

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 rendimentos


/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                                                                                  

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


/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                                                                                  

A primeira chamada utiliza newlib(consulte as linhas 1 e 3 da saída), a segunda segue as inclusões padrão. Os arquivos comuns no final da lista são um exemplo para o uso de include_next.

Conclusão: sempre considere todas as macros e opções do compilador ao imprimir os diretórios de inclusão.


1

Basta executar o seguinte para listar os caminhos de pesquisa padrão:

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

Isso não lista os caminhos de inclusão. Único caminho programas e bibliotecas caminho
kayahr

cc1normalmente não pode ser chamado diretamente porque é um comando interno que não está no PATH. Talvez você queira editar sua resposta para descrever onde encontrar o arquivo.
kayahr
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.