configure
gera um Makefile
e geralmente outros arquivos, como config.cache
. O conteúdo desses arquivos é baseado nas opções que você passa para configure
e na observação de seu sistema. Por exemplo, muitos programas possuem componentes opcionais e configure
procura as dependências de cada componente e gera um makefile que apenas constrói os componentes para os quais você tem todas as dependências.
Se você executar configure
e, em seguida, alterar a configuração do sistema, deverá executar make distclean
primeiro (se o programa seguir as convenções usuais), para remover o makefile e o cache configure
. A execução de configure
normalmente funciona quando você deseja passar argumentos diferentes, mas não quando suas observações em cache são armazenadas no sistema.
Com relação às bibliotecas, o estágio configure
examina o que você tem do ponto de vista de compatibilidade de origem. Se libfoo2
for compatível com origem com libfoo3
, mas não com libfoo1
, e você tiver libfoo2
, o makefile resultante funcionará construindo um binário vinculado a libfoo2
ou um binário vinculado a libfoo3
, mas não um binário vinculado a libfoo1
(a compilação falharia devido à incompatibilidade no nível de origem).
Quando o executável é compilado e vinculado, o requisito da versão se torna mais preciso: o executável resultante precisa de uma biblioteca compatível com o binário (mesma ABI, não apenas a mesma API).
Os executáveis não codificam caminhos completos para as bibliotecas; codificam nomes de bibliotecas ( -l
argumento para o vinculador) e, às vezes, um caminho de pesquisa da biblioteca de tempo de execução ( -rpath
) que vem além do caminho de pesquisa padrão do sistema de destino. Encontrar as bibliotecas em tempo de execução é o trabalho do vinculador dinâmico .
Eu recomendo jogar um pouco com ldd
e strace
. ldd
mostra as bibliotecas requeridas por um executável e onde o sistema as encontraria. strace
mostra todas as chamadas do sistema que acontecem quando um programa é carregado; os primeiros vêm do vinculador dinâmico que carrega as bibliotecas necessárias. Aqui estão algumas experiências cujos resultados você deve tentar entender.
ldd /bin/true
strace /bin/true
perl -pe 's/libc\.so/libc.zz/' </bin/true >broken
chmod +x broken
ldd ./broken
strace ./broken
ln -s /lib/libc.so.6 libc.zz.6
LD_LIBRARY_PATH=. strace ./broken
Resumindo as respostas para suas perguntas específicas:
-
configure
codifica problemas de compatibilidade de origem. A etapamake
codifica problemas de compatibilidade binária. Os locais da biblioteca são determinados em tempo de execução. - Se apenas o local da biblioteca foi alterado, o vinculador dinâmico normalmente o encontrará (se você tiver uma biblioteca instalada em um local fora do padrão, passe a variável de ambiente
LD_LIBRARY_PATH
). Se você tem apenas uma versão diferente da biblioteca, então não é a mesma biblioteca; você precisa obter uma biblioteca com a versão ABI que seu programa é compilado, ou compilar seu programa com a versão ABI para a qual você tem a biblioteca instalada. -
configure
determina a configuração de compilação do que você tem em seu sistema e os argumentos que você passa.make
constrói o executável e outros bits.make install
copia os bits no lugar; somente esse estágio pode exigir permissões elevadas (se você ainda não tiver permissão para gravar no diretório de destino, por exemplo, se estivesse instalando em seu diretório pessoal). -
configure
sobrescreve o makefile, mas re-executarconfigure
não inicia do zero porque mantém um cache.