.so
arquivos são bibliotecas dinâmicas . O sufixo significa "objeto compartilhado", porque todos os aplicativos vinculados à biblioteca usam o mesmo arquivo, em vez de fazer uma cópia no executável resultante.
.a
arquivos são bibliotecas estáticas . O sufixo significa "archive", porque na verdade são apenas um archive (feito com o ar
comando - um predecessor tar
que agora é usado apenas para criar bibliotecas) dos arquivos de objeto .o originais.
.la
arquivos são arquivos de texto usados pelo pacote "libtools" do GNU para descrever os arquivos que compõem a biblioteca correspondente. Você pode encontrar mais informações sobre eles nesta pergunta: Para que servem o arquivo .la do libtool?
As bibliotecas estáticas e dinâmicas têm prós e contras.
Static pro: o usuário sempre usa a versão da biblioteca que você testou com seu aplicativo, portanto, não deve haver problemas de compatibilidade surpreendentes.
Contraste estático: se um problema for corrigido em uma biblioteca, você precisará redistribuir seu aplicativo para tirar proveito dele. No entanto, a menos que seja uma biblioteca que os usuários provavelmente atualizem por conta própria, talvez seja necessário fazer isso de qualquer maneira.
Profissional dinâmico: o espaço ocupado pela memória do processo é menor, porque a memória usada para a biblioteca é amortizada entre todos os processos que utilizam a biblioteca.
Profissional dinâmico: as bibliotecas podem ser carregadas sob demanda em tempo de execução; isso é bom para plug-ins, assim você não precisa escolher os plug-ins a serem usados ao compilar e instalar o software. Novos plugins podem ser adicionados rapidamente.
Contração dinâmica: a biblioteca pode não existir no sistema em que alguém está tentando instalar o aplicativo ou pode ter uma versão incompatível com o aplicativo. Para atenuar isso, o pacote de aplicativos pode precisar incluir uma cópia da biblioteca para poder instalá-lo, se necessário. Isso também é frequentemente mitigado pelos gerenciadores de pacotes, que podem baixar e instalar quaisquer dependências necessárias.
Bibliotecas dinâmicas são especialmente úteis para bibliotecas do sistema, como libc
. Essas bibliotecas geralmente precisam incluir código que depende do SO e da versão específicos, porque as interfaces do kernel foram alteradas. Se você vincular um programa a uma biblioteca estática do sistema, ele será executado apenas na versão do SO para a qual esta versão da biblioteca foi gravada. Mas se você usar uma biblioteca dinâmica, ela buscará automaticamente a biblioteca que está instalada no sistema em que você executa.