c++ - library - create static lib




Diferença entre bibliotecas estáticas e compartilhadas? (6)

A vantagem mais significativa das bibliotecas compartilhadas é que há apenas uma cópia do código carregada na memória, independentemente de quantos processos estejam usando a biblioteca. Para bibliotecas estáticas, cada processo obtém sua própria cópia do código. Isso pode levar a um desperdício significativo de memória.

OTOH, uma vantagem das bibliotecas estáticas é que tudo é empacotado em seu aplicativo. Então você não precisa se preocupar que o cliente terá a biblioteca (e versão) certa disponível em seu sistema.

Qual é a diferença entre bibliotecas estáticas e compartilhadas?

Eu uso o Eclipse e existem vários tipos de projetos, incluindo Bibliotecas Estáticas e Bibliotecas Compartilhadas? Alguém tem vantagem sobre o outro?


Além de todas as outras respostas, uma coisa que não foi mencionada ainda é a dissociação:

Deixe-me falar sobre um código de produção do mundo real, com o qual tenho lidado:

Um software muito grande, feito de mais de 300 projetos (com visual studio), na maioria das vezes construído como lib estático e, finalmente, todos juntos em um grande executável, você acaba com os seguintes problemas:

Tempo de ligação é extremamente longo. Você pode acabar por mais de 15min de link, digamos 10s de tempo de compilação. Algumas ferramentas estão no seu joelho com um executável tão grande, como ferramentas de verificação de memória que devem instrumentar o código. Você pode cair em alcançar limites que foram vistos como tolos.

Mais problemático é o desacoplamento do seu software: neste exemplo do mundo real, os arquivos de cabeçalhos de todos os projetos eram alcançáveis ​​de qualquer outro projeto. Como consequência, foi extremamente fácil para um desenvolvedor adicionar dependências; foi apenas sobre a inclusão do cabeçalho, porque o link no final vai allwaws encontrar símbolos. Ele acaba por dependências de ciclismo horríveis e bagunça completa.

Com a biblioteca compartilhada, é um pouco de trabalho extra, pois o desenvolvedor deve editar o sistema de compilação do projeto para adicionar a biblioteca dependente. Observei que o código da biblioteca compartilhada tende a oferecer uma API de código mais limpa.


Bibliotecas estáticas são compiladas como parte de um aplicativo, enquanto bibliotecas compartilhadas não são. Quando você distribui um aplicativo que depende de bibliotecas compartilhadas, as bibliotecas, por exemplo. dll no MS Windows precisa ser instalado.

A vantagem das bibliotecas estáticas é que não há dependências necessárias para o usuário que está executando o aplicativo - por exemplo, elas não precisam atualizar sua DLL de qualquer coisa. A desvantagem é que seu aplicativo é maior em tamanho, porque você o envia com todas as bibliotecas necessárias.

Além de levar a aplicativos menores, as bibliotecas compartilhadas oferecem ao usuário a capacidade de usar sua própria versão, talvez melhor, das bibliotecas, em vez de confiar em uma que faz parte do aplicativo.


Para uma biblioteca estática, o código é extraído da biblioteca pelo vinculador e usado para construir o executável final no ponto em que você compila / constrói seu aplicativo. O executável final não tem dependências na biblioteca em tempo de execução

Para uma biblioteca compartilhada, o compilador / vinculador verifica se os nomes vinculados existem na biblioteca quando o aplicativo é criado, mas não move o código para o aplicativo. No tempo de execução, a biblioteca compartilhada deve estar disponível.

A linguagem de programação C em si não tem nenhum conceito de bibliotecas estáticas ou compartilhadas - elas são completamente um recurso de implementação.

Pessoalmente, prefiro muito mais usar bibliotecas estáticas, pois isso simplifica a distribuição de software. No entanto, esta é uma opinião sobre a qual muito sangue (figurativo) foi derramado no passado.


Uma biblioteca estática é como uma livraria, e uma biblioteca compartilhada é como ... uma biblioteca. Com o primeiro, você obtém sua própria cópia do livro / função para levar para casa; com este último você e todos os outros vão à biblioteca para usar o mesmo livro / função. Então, qualquer pessoa que queira usar a biblioteca (compartilhada) precisa saber onde ela está, porque você precisa "pegar" o livro / função. Com uma biblioteca estática, o livro / função é seu, e você o mantém dentro de sua casa / programa, e uma vez que você o tenha, você não se importa onde ou quando você o conseguiu.


-------------------------------------------------------------------------
|  +-  |    Shared(dynamic)       |   Static Library (Linkages)         |
-------------------------------------------------------------------------
|Pros: | less memory use          |   an executable, using own libraries|
|      |                          |     ,coming with the program,       |
|      |                          |   doesn't need to worry about its   |
|      |                          |   compilebility subject to libraries|
-------------------------------------------------------------------------
|Cons: | implementations of       |   bigger memory uses                |
|      | libraries may be altered |                                     |
|      | subject to OS  and its   |                                     |
|      | version, which may affect|                                     |
|      | the compilebility and    |                                     |
|      | runnability of the code  |                                     |
-------------------------------------------------------------------------




static-libraries