Pergunta

Eu nunca pensei muito na diferença de tamanho entre uma biblioteca estática e uma biblioteca dinâmica até que eu baixei as bibliotecas pré-construídas do Boost hoje. Descobri que as bibliotecas estáticas do Boost são muito maiores que as bibliotecas dinâmicas.

Por exemplo, a biblioteca estática de onda de impulso multithread de depuração é 97.7 mb em tamanho, enquanto a mesma biblioteca, mas dinâmica, é apenas 1.4 mb em tamanho (incluindo a Biblioteca de Importação e DLL)! Essa é uma enorme diferença. Por que é que?

Segunda pergunta, se eu vincular estaticamente, digamos, o wave biblioteca. Isso significa que meu executável balançará em tamanho para mais do que 97.7 mb?

Foi útil?

Solução

As bibliotecas estáticas têm as informações completas do símbolo de depuração. Para DLLs, essas informações estariam nos arquivos .pdb (o que eu presumo que seria semelhante em tamanho ao LIBS estático).

Quando você vincula à LIB estática, as informações do símbolo não serão copiadas no .exe - elas serão colocadas no arquivo .pdb (se sua compilação estiver configurada para criar um arquivo .pdb). O arquivo .pdb não precisa ser distribuído com o .exe, se o .pdb é criado ou não.

No download da biblioteca pré-criada que recebo no boostpro.com, não recebo arquivos .pdb para as DLLs de impulso que eles fornecem. Se você criar as DLLs, provavelmente obterá os arquivos .pdb (embora você precise definir alguma opção de configuração, para a qual não tenho idéia de quais são os detalhes).


atualizar:

Parece que posso estar errado em obter facilmente arquivos .pdb para as DLLs de Boost. A partir de http://comments.gmane.org/gmane.comp.lib.boost.build/23246:

> Is there an additional option that I can pass on the command line to
> have the (correctly generated) PDB files also copied into the stage
> directory?

Não agora. Você só pode hackear tools/build/v2/tools/package.jam adicionar <install-type>PDB em todos os lugares onde <install-type>SHARED_LIB ou <install-type>STATIC_LIB agora está escrito.

Outras dicas

Não, apenas porque o arquivo lib é um certo tamanho, não significa que ele adicionará esse tamanho ao seu exe. De fato, a maioria dos ligantes é inteligente o suficiente para vincular apenas as coisas usadas. Compare isso com uma biblioteca dinâmica, que deve conter tudo.

As bibliotecas estáticas definitivamente aumentam o seu exe, mas eu sempre prefiro. Então não preciso me preocupar com bibliotecas ausentes ou incompatíveis no tempo de execução. (Ou pelo menos, minimizo as chances disso.)

Como as bibliotecas estáticas não contêm dados binários acabados, mas sim informações necessárias para o vinculador criar binário, essas informações podem ser maiores que os binários construídos.

Quando alguma função definida no arquivo de cabeçalho é usada no arquivo de CPP, o Compiler coloca seu código (inlines ou simplesmente adiciona) ao arquivo de objeto resultante. Isso significa que haverá muitas duplicatas. É o trabalho do vinculador mesclá -los, então a biblioteca estática apenas espera que o vinculador seja reduzido :)

Geralmente, o tamanho do executável é geralmente maior com as bibliotecas estáticas, mas o tamanho do executável junto com as bibliotecas dinâmicas é geralmente menor. DLL e EXE estão vinculados separadamente, portanto, o vinculador não pode saber qual funcionalidade é necessária na DLL e quais podem ser expulsos. Em caso de biblioteca estática, o Linker possui essas informações e pode levar apenas os arquivos de OBJ que são usados.

A Biblioteca estática de depuração contém informações de depuração, o que explica a enorme diferença de tamanho.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top