Bibliotecas compartilhadas são chamadas, por exemplo libfoo.so-x.y.z
, com a idéia de que z
é incrementado para pequenas alterações (totalmente compatíveis), y
é incrementado para adições de API que mantêm compatibilidade com versões anteriores, enquanto alterações para x
são reservadas para grandes mudanças de API compatível). O programa executável (verifique, por exemplo, a saída de ldd(1)
para um executável) informa a biblioteca que o programa solicita, pelo número principal ( libfoo.so.x
) e qual biblioteca é usada para preencher essa dependência ( libfo.so.x.y.z
). Os "links contra libfoo.so.x
" são fixados no tempo de compilação, o exato y.z
na inicialização. Assim, você pode alterar y
e / ou z
e ter programas ainda funcionando e, por exemplo, libfoo.so.3
e libfoo.so.4
instalados ao mesmo tempo, com alguns programas usando um ou os outros sem conflitos.
Se você olhar os diretórios para bibliotecas, verá uma cadeia de links simbólicos como libfoo.so -> libfoo.so.x -> libfoo.so.x.y.z
; ao vincular com -lfoo
, o vinculador seguirá isso e adicionará libfoo.so.x
como dependência ao executável e usar libfoo.so.x.y.z
para resolver os símbolos.
Este maquinário é feito sob medida para obter sempre o mais recente libfoo
ao compilar, embora tenha versões antigas para aplicativos legados. Assim, muitas vezes você verá, por exemplo libbar.so
e libbar3.so
(e seu farm de links simbólicos) para poder construir contra a versão 2 ( -lbar
, se a versão legada não numerada for 2) ou 3 ( -lbar3
).
O maquinário de construção deve ser capaz de resolver isso, mas é bastante complicado (e nem todos estão empolgados com a idéia de que sua última e mais brilhante versão 3 permanecerá ao lado da versão 2).
Sua melhor aposta é confiar em sua distribuição para configurar essa confusão para você.