Pregunta

Nunca puse mucha atención en la diferencia de tamaño entre una biblioteca estática y una biblioteca dinámica hasta que he descargado bibliotecas de impulso pre-construidos en la actualidad. He descubierto que las bibliotecas estáticas de impulso son mucho, mucho más grande que las bibliotecas dinámicas.

Por ejemplo, la biblioteca estática de onda impulso de depuración multiproceso es 97.7 mb en tamaño, mientras que la misma biblioteca, sino dinámica, sólo es 1.4 mb en tamaño (incluyendo biblioteca de importación y DLL)! Es una diferencia enorme. ¿Por qué es eso?

La segunda pregunta, si yo estáticamente enlazar con, digamos, la biblioteca wave. ¿Eso significa que mi ejecutable hinchará en tamaño a más de 97.7 mb?

¿Fue útil?

Solución

Las bibliotecas estáticas tienen la información de símbolos de depuración completa en ellos. Para archivos DLL que la información estaría en archivos .pdb (que supongo que sería similar en tamaño a las librerías estáticas).

Cuando se vincula a la lib estática, la información de símbolos no se copiará en el .exe - se colocará en el archivo .pdb (si su acumulación está configurado para crear un archivo .pdb). El archivo .pdb no tiene que ser distribuido con el .exe, si no se crea el .pdb.

En la biblioteca descarga pre-construidos que recibo de boostpro.com, no consigo archivos .pdb para impulsar las DLL que proporcionan. si se construye el DLL mismo, es probable que obtener los archivos .pdb (aunque es posible que tenga que configurar alguna opción de configuración, por lo que no tengo idea de lo que son los detalles).


Actualización:

Parece que podría estar equivocado acerca de cómo obtener fácilmente archivos .pdb para impulsar las DLL. 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?
     

No en este momento. Sólo se puede piratear   tools/build/v2/tools/package.jam a   añadir <install-type>PDB todas partes donde   <install-type>SHARED_LIB o   <install-type>STATIC_LIB es ahora   por escrito.

Otros consejos

No, sólo porque el archivo LIB es un cierto tamaño, no significa que vaya a añadir que el tamaño de su archivo EXE. De hecho, la mayoría de los compiladores son lo suficientemente inteligentes para eslabón de solamente la materia que se utiliza. Compare esto con una biblioteca dinámica, que debe contener todo.

Las librerías estáticas duda hará que su EXE más grande, pero siempre me lo prefieren. Entonces no tiene que preocuparse por perder o bibliotecas incompatibles en tiempo de ejecución. (O al menos, puedo minimizar las posibilidades de que esto.)

Desde las bibliotecas estáticas no contienen datos binarios terminados, sino más bien la información necesaria para enlazador para construir binario, esta información puede ser más grande que los binarios construidos.

Cuando alguna función definida en el archivo de cabecera se utiliza en CPP-archivo, compilador pone su código (ya sea inline, o simplemente añade) a que resulta fichero objeto. Esto significa que habrá una gran cantidad de duplicados. Es trabajo del enlazador de fusionar ellos, por lo que la biblioteca estática simplemente espera a que se reduzca enlazador:)

En general, el tamaño del ejecutable es generalmente más grande con las bibliotecas estáticas, pero el tamaño de las juntas ejecutable con bibliotecas dinámicas es generalmente más pequeño. DLL y EXE están vinculados por separado, por lo enlazador no pueden saber lo que se necesita en la funcionalidad DLL y que puede ser desechado. En caso de biblioteca estática, enlazador tiene dicha información y puede tomar sólo aquellos archivos que se utilizan obj.

La biblioteca de depuración estática contiene información de depuración, lo que explica la enorme diferencia de tamaño.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top