Dicas para GCC: Obtendo paths defaults

Como é que o GCC sabe onde procurar pelos headers e pelas libraries? Quando as libraries, os paths estão configurados em /etc/ld.so.conf.d/, em diversos arquivos de configuração. No caso dos headers a coisa é mais complicada.

Você pode obter informações dos paths com as linhas de comando abaixo:

$ gcc -E -Wp,-v - < /dev/null
ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/5/../../../../x86_64-linux-gnu/include"
#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.
...

$ ld --verbose | grep SEARCH_DIR | tr -s ' ;' "\n"
SEARCH_DIR("=/usr/local/lib/x86_64-linux-gnu")
SEARCH_DIR("=/lib/x86_64-linux-gnu")
SEARCH_DIR("=/usr/lib/x86_64-linux-gnu")
SEARCH_DIR("=/usr/local/lib64")
SEARCH_DIR("=/lib64")
SEARCH_DIR("=/usr/lib64")
SEARCH_DIR("=/usr/local/lib")
SEARCH_DIR("=/lib")
SEARCH_DIR("=/usr/lib")
SEARCH_DIR("=/usr/x86_64-linux-gnu/lib64")
SEARCH_DIR("=/usr/x86_64-linux-gnu/lib")

Note que o meu GCC procura os headers em 5 diretórios diferentes (marcados em vermelho). Se ele não encontrar o arquivo especificado na diretiva #include <...> em nenhum desses diretórios e no diretório atual, então uma mensagem de erro é gerada.

As libraries são procuradas em 11 diretórios diferentes, no meu caso.

Repare também que em ambos os casos existe um diretório dentro de /usr/local/ que pode ser usado por você para colocar seus próprios headers (em /usr/local/include/) e libraries (em /usr/local/lib/), para não “contaminar” os diretórios default. Pode ser que no seu diretório /usr/local/lib/ já existam libraries (o python, por exemplo, costuma colocar libs lá!).

Eu não recomendo a manipulação direta dos arquivos de configuração de ambos os casos. No caso do GCC, pode-se criar um spec file específico para conter definições de compilação default. Não é tarefa fácil, mas também não um bicho de outro mundo… No segundo caso, o do linker, bastaria apenas adicionar um arquivo “.conf” no diretório anteriormente citado contendo uma linha com o path desejado.

Acontece que para isso existem as opções -I (do GCC) e -L (do linker), onde você pode especificar diretórios de busca adicionais.

Anúncios