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:
-
configurecodifica problemas de compatibilidade de origem. A etapamakecodifica 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. -
configuredetermina a configuração de compilação do que você tem em seu sistema e os argumentos que você passa.makeconstrói o executável e outros bits.make installcopia 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). -
configuresobrescreve o makefile, mas re-executarconfigurenão inicia do zero porque mantém um cache.