Pergunta

Eu tenho uma biblioteca estática * .lib criado usando MSVC em janelas. O tamanho da biblioteca é digamos 70KB. Então eu tenho uma aplicação que liga esta biblioteca. Mas agora o tamanho do executável final (* .exe) é 29KB, menos do que a biblioteca. O que eu quero saber é:

  1. Uma vez que a biblioteca é estaticamente ligado, eu estava pensando que deve adicionar diretamente para o tamanho do executável e do tamanho exe final deve ser mais do que isso? O Windows formato exe também fazer alguma compressão dos dados binários?

  2. Como é para sistemas Linux, que é como tamanhos de biblioteca no Linux (* .a / *. La arquivo) se relacionam com o tamanho do linux executável (* .out)?

-AD

Foi útil?

Solução

Não há informações de registo adicional no arquivo .lib que não é necessário para o executável final. Esta informação ajuda o vinculador encontrar o código para realmente link. Além disso, informações de depuração podem ser armazenadas no arquivo .lib, mas não no arquivo .exe (não me lembro onde informações de depuração é armazenada para objs em um arquivo lib, que poderia ser em outro lugar).

Outras dicas

A biblioteca estática em Windows e Unix é uma coleção de obj / .o arquivos. O vinculador olha para cada um desses arquivos objeto e determina se ela é necessária para que o programa link. Se não é necessário, em seguida, o arquivo objeto não são incluídos no executável final. Isso pode levar a executáveis ??que são menores, em seguida, a biblioteca.

EDIT: Como MSalters aponta, no Windows o compilador VC ++ agora suporta a geração de arquivos de objetos que permitem a função de nível de ligação, por exemplo, ver aqui . Na verdade, editar-and-continuar exige isso, desde a edição e continuação precisa ser capaz de substituir a menor parte possível do executável.

A biblioteca estática provavelmente contém várias funções que nunca são usados. Quando o vinculador vincula a biblioteca com o executável principal, ele vê que certas funções não são utilizados (e que seus endereços nunca são tiradas e armazenadas em ponteiros de função), ele simplesmente joga fora o código. Ele também pode fazer isso de forma recursiva: se a função A () nunca é chamado, e A () chama B (), mas B () nunca é chamado de outra forma, ele pode remover o código para a A () e B (). No Linux, a mesma coisa acontece.

Aviso :. Tem sido um longo tempo desde que eu lidei com vinculação estática, assim que tomar a minha resposta com um grão de sal

Você escreveu: Eu estava pensando que deve adicionar diretamente para o tamanho do executável e tamanho final exe deve ser mais do que isso

?

Os ligantes Naive funcionam exatamente desta maneira - quando eu estava fazendo o desenvolvimento hobby para CP / sistemas de M (um longo tempo atrás), este foi um problema real.

Os ligantes modernos são mais inteligentes, no entanto - eles só ligar nas funções referenciados pelo código original, ou conforme exigido

.

Além das respostas atuais, o ligador é permitida para remover as definições de função se eles têm código objeto idêntico -. Este se destina a ajudar a reduzir os efeitos inchaço de código templated

A biblioteca estática tem que conter todas símbolo definido em seu código fonte, porque pode ficar ligado em um arquivo executável que precisa apenas esse símbolo específico. Mas uma vez que está ligada em um arquivo executável, sabemos exatamente quais símbolos acabam sendo usados, e quais não. Assim, o vinculador pode trivialmente remover código não utilizado, aparando o tamanho do arquivo por um lote. Da mesma forma, quaisquer símbolos duplicados (qualquer coisa que é definido tanto no biblioteca estática eo executável é vinculado a se fundiram em uma única instância.

@All: Obrigado pelas dicas. @ Greg Hewgill - Sua resposta foi um bom indicador. Obrigado.

A resposta que eu descobri foi o seguinte:

1.) Durante Biblioteca construindo o que acontece é, se a opção "Manter Programa de depuração databse" em MSVC (ou algo semelhante) é ON, em seguida, biblioteca terá essa informação de depuração inchaço seu tamanho. mas quando eu estaticamente incluir essa biblioteca e criar um executável, o vinculador retira toda essa informação de depuração da biblioteca antes geenrating o exe e, portanto, o tamanho exe é menor que a da biblioteca.

2). Quando eu desativei a opção "Manter Programa de depuração databse", eu tenho uma biblioteca cujo tamanho era menor do que o executável final, que foi o que eu pensei é nromal na maioria das situações.

-AD

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