Archivos DLL y LIB: ¿qué y por qué?
Sé muy poco sobre las DLL y las LIB, aparte de que contienen código vital necesario para que un programa se ejecute correctamente: bibliotecas. Pero, ¿por qué los compiladores los generan? ¿No sería más fácil incluir todo el código en un único ejecutable? ¿Y cuál es la diferencia entre DLL y LIB?
Hay bibliotecas estáticas (LIB) y bibliotecas dinámicas (DLL), pero tenga en cuenta que los archivos .LIB pueden ser bibliotecas estáticas (que contienen archivos objeto) o bibliotecas de importación (que contienen símbolos para permitir que el vinculador se vincule a una DLL).
Las bibliotecas se utilizan porque es posible que tenga código que desee utilizar en muchos programas. Por ejemplo, si escribe una función que cuente el número de caracteres en una cadena, esa función será útil en muchos programas. Una vez que esa función funcione correctamente, no querrás tener que volver a compilar el código cada vez que la uses, por lo que colocas el código ejecutable para esa función en una biblioteca y el vinculador puede extraer e insertar el código compilado en tu programa. . Las bibliotecas estáticas a veces se denominan "archivos" por este motivo.
Las bibliotecas dinámicas van un paso más allá. Parece un desperdicio tener múltiples copias de las funciones de la biblioteca ocupando espacio en cada uno de los programas. ¿Por qué no pueden todos compartir una copia de la función? Para eso están las bibliotecas dinámicas. En lugar de incorporar el código de la biblioteca en su programa cuando se compila, se puede ejecutar mapeándolo en su programa a medida que se carga en la memoria. Varios programas que se ejecutan al mismo tiempo y utilizan las mismas funciones pueden compartir una copia, ahorrando memoria. De hecho, puede cargar bibliotecas dinámicas solo según sea necesario, según la ruta a través de su código. No tiene sentido que las rutinas de la impresora ocupen memoria si no estás imprimiendo. Por otro lado, esto significa que debe tener una copia de la biblioteca dinámica instalada en cada máquina en la que se ejecute su programa. Esto crea su propio conjunto de problemas.
Como ejemplo, casi todos los programas escritos en 'C' necesitarán funciones de una biblioteca llamada 'biblioteca de ejecución de C', aunque pocos programas necesitarán todas las funciones. El tiempo de ejecución de C viene en versiones estáticas y dinámicas, por lo que puede determinar qué versión utiliza su programa según sus necesidades particulares.
Otro aspecto es la seguridad (ofuscación). Una vez que se extrae un fragmento de código de la aplicación principal y se coloca en una biblioteca de vínculos dinámicos "separada", es más fácil atacar, analizar (realizar ingeniería inversa) el código, ya que ha sido aislado. Cuando el mismo fragmento de código se guarda en una biblioteca LIB, forma parte de la aplicación de destino compilada (vinculada) y, por lo tanto, es más difícil aislar (diferenciar) ese fragmento de código del resto de los archivos binarios de destino.
Una razón importante para crear una DLL/LIB en lugar de simplemente compilar el código en un ejecutable es la reutilización y la reubicación. Lo más probable es que una aplicación Java o .NET promedio (por ejemplo) utilice varias bibliotecas (o marcos) de terceros. Es mucho más fácil y rápido simplemente compilar con una biblioteca prediseñada, en lugar de tener que compilar todo el código de terceros en su aplicación. Compilar su código en bibliotecas también fomenta buenas prácticas de diseño, por ejemplo, diseñar sus clases para usarlas en diferentes tipos de aplicaciones.
Una DLL es una biblioteca de funciones que se comparten entre otros programas ejecutables. Simplemente mire en su directorio windows/system32 y encontrará docenas de ellos. Cuando su programa crea una DLL, normalmente también crea un archivo lib para que el programa de aplicación *.exe pueda resolver los símbolos declarados en la DLL.
Un .lib es una biblioteca de funciones que están vinculadas estáticamente a un programa; NO son compartidas por otros programas. Cada programa que se vincula con un archivo *.lib tiene todo el código en ese archivo. Si tiene dos programas A.exe y B.exe que se vinculan con C.lib, cada A y B contendrán el código en C.lib.
La forma de crear archivos DLL y bibliotecas depende del compilador que utilice. Cada compilador lo hace de manera diferente.