Onde o gcc procura pelos arquivos de header C e C ++?

Em um sistema Unix, onde o gcc procura por arquivos de header?

Eu passei um tempinho esta manhã procurando por alguns arquivos de header do sistema, então eu pensei que seria uma boa informação ter aqui.

`gcc -print-prog-name=cc1plus` -v 

Esse comando pergunta ao gcc qual pré-processador de C ++ está sendo usado e, em seguida, pergunta se o pré-processador onde ele está incluído inclui.

Você receberá uma resposta confiável para sua configuração específica.

Da mesma forma, para o pré-processador C :

 `gcc -print-prog-name=cc1` -v 

Além disso, o gcc irá procurar nos diretórios especificados após a opção -I .

Você pode criar um arquivo que tente include um header do sistema falso. Se você executar o gcc no modo detalhado em tal fonte, ele listará todos os locais de inclusão do sistema, à medida que procurar o header falso.

 $ echo "#include <bogus.h> int main(){}" > tc; gcc -v tc; rm tc [..] #include "..." search starts here: #include <...> search starts here: /usr/local/include /usr/lib/gcc/i686-apple-darwin9/4.0.1/include /usr/include /System/Library/Frameworks (framework directory) /Library/Frameworks (framework directory) End of search list. [..] tc:1:32: error: bogus.h: No such file or directory 

A seção CPP do Manual do GCC indica que os arquivos de header podem estar localizados nos seguintes diretórios:

O GCC procura em vários lugares diferentes para headers. Em um sistema Unix normal, se você não instruir de outra forma, ele irá procurar pelos headers solicitados com #include em:

  /usr/local/include libdir/gcc/target/version/include /usr/target/include /usr/include 

Para programas C ++, ele também irá procurar em / usr / include / g ++ – v3, primeiro.

 g++ -print-search-dirs gcc -print-search-dirs 

Para que o GCC imprima o conjunto completo de diretórios onde procurará os headers do sistema, invoque-o assim:

 $ LC_ALL=C gcc -v -E -xc - < /dev/null 2>&1 | LC_ALL=C sed -ne '/starts here/,/End of/p' 

que produzirá a saída do formulário

 #include "..." search starts here: #include <...> search starts here: /usr/lib/gcc/x86_64-linux-gnu/5/include /usr/local/include /usr/lib/gcc/x86_64-linux-gnu/5/include-fixed /usr/include/x86_64-linux-gnu /usr/include End of search list. 

Se você tiver opções -I family na linha de comando, elas afetarão o que é impresso.

(O comando sed é para se livrar de todo o lixo que essa invocação imprime, e o LC_ALL=C é para garantir que o comando sed funcione – as frases “começa aqui” e “Fim da lista de busca” são traduzidas como IIRC.)

O conjunto de caminhos onde o compilador procura os arquivos de header pode ser verificado pelo comando: –

cpp -v

Se você declarar #include “” , o compilador primeiro procurará no diretório atual do arquivo de origem e, se não for encontrado, continuará pesquisando nos diretórios recuperados acima.

Se você declarar #include <> , o compilador pesquisará diretamente nos diretórios obtidos a partir do comando acima.

Fonte: http://commandlinefanatic.com/cgi-bin/showarticle.cgi?article=art026

Pode-se ver o caminho de inclusão (adicional) para um programa C do bash verificando o seguinte:

 echo $C_INCLUDE_PATH 

Se estiver vazio, ele poderá ser modificado para include locais de inclusão padrão, por:

 export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/include 

Estes são os diretórios que o gcc procura por padrão para os arquivos de header especificados (dado que os arquivos de header são incluídos em divisas <>); 1. / usr / local / include / –used para arquivos de cabeçalho de terceiros. 2. / usr / include / – usado para arquivos de cabeçalho do sistema.

Se, no caso de você decidir colocar seu arquivo de header personalizado em um lugar diferente dos diretórios mencionados acima, você pode incluí-los da seguinte forma: 1. usando aspas (“./custom_header_files/foo.h”) com o caminho dos arquivos, em vez de divisas na declaração include. 2. usando o switch -I ao compilar o código. gcc -I / home / usuario / custom_headers / -c foo.c -p foo.o Basicamente, o switch -I diz ao compilador para procurar primeiro no diretório especificado com a opção -I (antes de verificar os diretórios padrão) .Quando Usando a opção -I, os arquivos de header podem ser incluídos usando divisas.