2009-05-27 28 views
153

Sé muy poco sobre las DLL y las LIB salvo que contienen un código vital necesario para que un programa se ejecute correctamente: bibliotecas. Pero, ¿por qué los compiladores los generan en absoluto? ¿No sería más fácil incluir todo el código en un solo ejecutable? ¿Y cuál es la diferencia entre DLL y LIB?Archivos DLL y LIB, ¿qué y por qué?

Respuesta

220

Hay bibliotecas estáticas (LIB) y bibliotecas dinámicas (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 cuenta el número de caracteres en una cadena, esa función será útil en muchos programas. Una vez que obtiene esa función funcionando correctamente, no desea tener que volver a compilar el código cada vez que la usa, por lo que coloca el código ejecutable para esa función en una biblioteca, y el enlazador puede extraer e insertar el código compilado en su programa. . Las bibliotecas estáticas a veces se llaman 'archivos' por este motivo.

Las bibliotecas dinámicas dan un paso más. 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? Esto es para lo que son las bibliotecas dinámicas. En lugar de construir el código de la biblioteca en su programa cuando se compila, puede ejecutarse asignándolo a su programa a medida que se carga en la memoria. Múltiples programas que se ejecutan al mismo tiempo y usan las mismas funciones, todos pueden compartir una copia, guardando la memoria. De hecho, puede cargar bibliotecas dinámicas solo según sea necesario, dependiendo de la ruta a través de su código. No tiene sentido que las rutinas de la impresora ocupen la memoria si no está 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 ejecuta 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 'C biblioteca de tiempo de ejecución, 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 las necesidades particulares.

+49

Resulta que los archivos '.LIB' pueden ser bibliotecas estáticas (que contienen archivos de objetos) o bibliotecas de importación (que contienen símbolos para permitir que el enlazador se vincule con una DLL). [Me pregunto por qué es así.] (Http://stackoverflow.com/q/6421693/269126) – Lumi

+1

¡buena explicación! El código se comparte y los datos (por defecto) no se comparten entre la (s) aplicación (es) que consumen un Dll. – mox

10

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 reubicación. La aplicación Java o .NET promedio (por ejemplo) probablemente usará varias bibliotecas de terceros (o framework). Es mucho más fácil y rápido compilar contra una biblioteca preconstruida, en lugar de tener que compilar todo el código de terceros en su aplicación. La compilación de su código en las bibliotecas también fomenta buenas prácticas de diseño, p. diseñando sus clases para ser usadas en diferentes tipos de aplicaciones.

24

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 (aplicar ingeniería inversa) el código, ya que se ha aislado. Cuando el mismo fragmento de código se guarda en una Biblioteca LIB, es 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 binarios de destino.

+0

El aspecto de seguridad era nuevo para mí. ¿El razonamiento anterior es verdadero en el caso de una aplicación C# que llama a un dll nativo no administrado de C++? – Martin

+0

Pero el LIB también está aislado, ¿no? Entonces un atacante podría simplemente analizar el LIB. ¿O es un escenario común que el LIB no es accesible al público? –

+3

la LIB también está "aislada", en lo que respecta al proceso del compilador, pero una vez que el enlazador pone las partes juntas, la LIB es parte del EXE y no se puede diferenciar de su propio código. – mox

7

Una DLL es una biblioteca de funciones que se comparten entre otros programas ejecutables. Simplemente busque 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 la aplicación * .exe pueda resolver los símbolos declarados en la DLL.

A .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 enlazan con C.lib, cada A y B contendrán el código en C.lib.

Cómo crear archivos DLL y libs depende del compilador que utilice. Cada compilador lo hace de manera diferente.

2

Otra diferencia radica en el rendimiento.

Como el DLL se carga en tiempo de ejecución por el .exe (s), el .exe (s) y el DLL funcionan con el concepto de memoria compartida y, por lo tanto, el rendimiento es bajo con respecto al enlace estático.

Por otro lado, un .lib es un código que está vinculado estáticamente en tiempo de compilación en cada proceso que las solicitudes. Por lo tanto, el .exe (s) tendrá memoria única, lo que aumenta el rendimiento del proceso.

Cuestiones relacionadas