6

Nunca pensé mucho en la diferencia de tamaño entre una biblioteca estática y una biblioteca dinámica hasta que descargué las bibliotecas preconstruidas de boost hoy. Descubrí que las bibliotecas estáticas de boost son mucho más grandes que las bibliotecas dinámicas.Diferencia de tamaño entre la biblioteca estática y dinámica (depuración) e impacto en el exe final

Por ejemplo, la biblioteca estática de refuerzo de onda múltiple de depuración es 97.7 mb de tamaño, mientras que la misma biblioteca, pero dinámica, tiene solo 1.4 mb (¡incluida la biblioteca de importación y dll)! Es una diferencia enorme. ¿Por qué es eso?

Segunda pregunta, si conecto estáticamente contra, digamos, la biblioteca wave. ¿Eso quiere decir que mi ejecutable aumentará en tamaño a más de 97.7 mb?

Respuesta

4

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

Cuando se vincula a la lib estática, la información del símbolo no se copiará en .exe - se colocará en el archivo .pdb (si su compilación está configurada para crear un archivo .pdb). El archivo .pdb no necesita ser distribuido con .exe, ya sea que se haya creado o no .pdb.

En la descarga de biblioteca preconstruida que recibo de boostpro.com, no obtengo archivos .pdb para las DLL de refuerzo que proporcionan. Si construye los archivos DLL usted mismo, probablemente obtendrá los archivos .pdb (aunque es posible que tenga que establecer alguna opción de configuración, para la cual no tengo idea de cuáles son los detalles).


actualización:

Parece que podría estar equivocado acerca de conseguir 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 escrita.

+2

Eso es muy interesante ... ¿están compilando bibliotecas estáticas de versiones con información de depuración? Eso no permitirá la optimización del programa completo y, por lo tanto, un código más lento (¿o estoy equivocado aquí)? – Samaursa

+0

.pdb archivos asume Windows/Visual Studio, que no se menciona en la pregunta (pero puede ser válido). –

+0

@Tony: tienes razón, debería haber dicho: "En mi configuración ..." –

3

No, solo porque el archivo LIB tenga un tamaño determinado, no significa que agregará ese tamaño a su EXE. De hecho, la mayoría de los enlazadores son lo suficientemente inteligentes como para vincular solo las cosas que se usan. Compare eso con una biblioteca dinámica, que debe contener todo.

Las librerías estáticas definitivamente hacen que su EXE sea más grande, pero siempre lo prefiero. Entonces no tengo que preocuparme por bibliotecas perdidas o incompatibles en tiempo de ejecución. (O al menos, minimizo las posibilidades de esto.)

0

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

1

Dado que las bibliotecas estáticas no contienen datos binarios terminados, sino información necesaria para que el vinculador construya archivos binarios, esta información puede ser más grande que los archivos binarios construidos.

Cuando se utiliza alguna función definida en el archivo de encabezado en el archivo cpp, el compilador coloca su código (ya sea en línea o simplemente agrega) al archivo de objeto resultante. Esto significa que habrá muchos duplicados. Es trabajo del enlazador fusionarlos, por lo que la biblioteca estática solo espera que el enlazador se reduzca :)

Generalmente, el tamaño del ejecutable suele ser mayor con las bibliotecas estáticas, pero el tamaño del ejecutable junto con las bibliotecas dinámicas suele ser más pequeño. DLL y EXE están vinculados por separado, por lo que el vinculador no puede saber qué funcionalidad se necesita en DLL y cuál puede descartarse. En el caso de la biblioteca estática, el vinculador tiene dicha información y solo puede tomar los obj-archivos que se utilizan.

Cuestiones relacionadas