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.
`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 decc1
? 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.fonte
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.
fonte
echo "#include <bogus.h>" | gcc -v -x c -
gcc -v -E - < /dev/null
oucpp -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:
fonte
Para que o GCC imprima o conjunto completo de diretórios em que ele procurará os cabeçalhos do sistema, chame-o assim:
que produzirá a saída do formulário
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, eLC_ALL=C
é para garantir que osed
comando funcione - as frases "começa aqui" e "Fim da lista de pesquisa" são traduzidas como IIRC.)fonte
fonte
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
fonte
Pode-se visualizar o caminho de inclusão (adicional) para um programa C a partir do bash, verificando o seguinte:
Se estiver vazio, pode ser modificado para adicionar locais de inclusão padrão, por:
fonte
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.
fonte