Em um sistema Unix, onde o gcc procura por arquivos de cabeçalho?
Passei um pouco de tempo esta manhã procurando alguns arquivos de cabeçalho do sistema, então achei que seria uma boa informação para ter aqui.
Em um sistema Unix, onde o gcc procura por arquivos de cabeçalho?
Passei um pouco de tempo esta manhã procurando alguns arquivos de cabeçalho do sistema, então achei que seria uma boa informação para ter aqui.
Respostas:
`gcc -print-prog-name=cc1plus` -v
Este comando pergunta ao gcc qual pré-processador C ++ está usando e, em seguida, pergunta ao pré-processador onde ele procura 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=cpp` -v
cpp
vez de cc1
? No meu debian Jessie $(gcc -print-prog-name=cpp) -v
(corretamente) dá mais um caminho, que é/usr/include/x86_64-linux-gnu
/dev/null
, então `gcc -print-prog-name=cc1` -v < /dev/null
.
Ctrl
+ D
, que envia "fim do arquivo" no Unix-talk.
Além disso, o gcc procurará nos diretórios especificados após a -I
opção.
Você pode criar um arquivo que tente incluir um cabeçalho de sistema falso. Se você executar o gcc no modo detalhado nessa fonte, ele listará todos os locais de inclusão do sistema, à medida que procura o cabeçalho falso.
$ echo "#include <bogus.h>" > t.c; gcc -v t.c; rm t.c
[..]
#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.
[..]
t.c:1:32: error: bogus.h: No such file or directory
echo "#include <bogus.h>" | gcc -v -x c -
gcc -v -E - < /dev/null
ou cpp -v < /dev/null
são suficientes. Você apenas tem que obter o pré-processador para executar , não importa o que de entrada que vê. (Os caminhos de pesquisa são impressos durante a inicialização, antes mesmo olha para sua entrada.)
A seção CPP do manual do GCC indica que os arquivos de cabeçalho podem estar localizados nos seguintes diretórios:
O GCC procura em vários lugares diferentes cabeçalhos. Em um sistema Unix normal, se você não o instruir de outra forma, ele procurará os cabeçalhos solicitados com #include in:
/usr/local/include
libdir/gcc/target/version/include
/usr/target/include
/usr/include
Para programas em C ++, ele também procurará em / usr / include / g ++ - v3, primeiro.
Para que o GCC imprima o conjunto completo de diretórios em que ele procurará os cabeçalhos do sistema, chame-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 -I
opções -family na linha de comando, elas afetarão o que é impresso.
(O sed
comando é se livrar de todos os outros itens indesejados que esta invocação imprime, e LC_ALL=C
é para garantir que o sed
comando funcione - as frases "começa aqui" e "Fim da lista de pesquisa" são traduzidas como IIRC.)
g++ -print-search-dirs
gcc -print-search-dirs
O conjunto de caminhos em que o compilador procura os arquivos de cabeçalho pode ser verificado pelo comando: -
cpp -v
Se você declarar #include "" , o compilador procurará primeiro 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 no comando acima.
Fonte: - http://commandlinefanatic.com/cgi-bin/showarticle.cgi?article=art026
Pode-se visualizar o caminho de inclusão (adicional) para um programa C a partir do bash, verificando o seguinte:
echo $C_INCLUDE_PATH
Se estiver vazio, pode ser modificado para adicionar locais de inclusão padrão, por:
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/include
Esses são os diretórios nos quais o gcc procura por padrão os arquivos de cabeçalho especificados (considerando que os arquivos de cabeçalho estão incluídos nas divisões <>); 1. / usr / local / include / - usado para arquivos de cabeçalho de terceiros. 2. / usr / include / - usado para arquivos de cabeçalho do sistema.
Se você decidir colocar seu arquivo de cabeçalho personalizado em um local diferente dos diretórios mencionados acima, poderá incluí-los da seguinte maneira: 1. usando aspas ("./custom_header_files/foo.h") com o caminho dos arquivos, em vez das divisas na instrução include. 2. usando a opção -I ao compilar o código. gcc -I / home / user / custom_headers / -c foo.c -p foo.o Basicamente, a opção -I informa ao compilador que primeiro procure no diretório especificado com a opção -I (antes de verificar os diretórios padrão). usando a opção -I, os arquivos de cabeçalho podem ser incluídos usando as divisas.