Por que o nome do vinculador da biblioteca está apenas no pacote -dev?

2

Pegue um pacote como o sqlite3:

link - link

Observe que o nome do linker ( /usr/lib/libsqlite3.so ) aparece apenas no pacote -dev. O mesmo padrão é válido para quase todas as bibliotecas compartilhadas. Por quê? Isso não vai confundir os programas que tentam carregar dinamicamente o sqlite3 usando dlopen("libsqlite3.so") quando esse arquivo está faltando, a menos que você tenha a variante -dev?

    
por Björn Lindqvist 22.04.2013 / 22:42

1 resposta

1

O arquivo libsqlite3.so é apenas um link simbólico para o nome do arquivo de biblioteca com versão completa, libsqlite3.so.0.8.6 . Em tempo de execução, o carregador dinâmico só conhece a biblioteca totalmente versionada. Isso é verdade para a maioria das bibliotecas compartilhadas. Existem algumas bibliotecas que não são versionadas e estão disponíveis apenas como libnspr4.so , por exemplo. No entanto, essas bibliotecas também são empacotadas corretamente, conforme apropriado.

Os programas não devem tentar copiar o link sem versão da biblioteca. Se quiserem fazer isso, eles devem usar o nome do arquivo libsqlite3.so.0 , por exemplo, que está instalado no pacote da biblioteca binária, em vez do pacote -dev fornecido. Desta forma, o programa continuará funcionando se o sqlite3 quebrar a compatibilidade da API em algum momento e houver um libsqlite3.so.1 . Usar libsqlite3.so.0 garantiria que o programa usaria a API da biblioteca na qual foi escrita para trabalhar.

    
por dobey 22.04.2013 / 23:20