¿Qué hay dentro del archivo .lib de la biblioteca estática, la biblioteca dinámica vinculada estáticamente y la biblioteca dinámica vinculada dinámicamente?

82

¿Qué hay dentro de un archivo .lib de biblioteca estática, biblioteca dinámica vinculada estáticamente y biblioteca dinámica vinculada dinámicamente?

¿Cómo es que no hay necesidad de un archivo .lib en la biblioteca dinámica vinculada dinámicamente y también que en el enlace estático, el archivo .lib no es más que un archivo .obj con todos los métodos? ¿Es eso correcto?

Sulla
fuente
4
Cabe señalar que la pregunta es sobre la plataforma MS Windows.
cubuspl42

Respuestas:

144

Para una biblioteca estática, el archivo .lib contiene todo el código y los datos de la biblioteca. El enlazador luego identifica los bits que necesita y los coloca en el ejecutable final.

Para una biblioteca dinámica, el archivo .lib contiene una lista de las funciones exportadas y los elementos de datos de la biblioteca, e información sobre de qué DLL provienen. Cuando el vinculador crea el ejecutable final, si se utiliza alguna de las funciones o elementos de datos de la biblioteca, el vinculador agrega una referencia a la DLL (lo que hace que Windows la cargue automáticamente) y agrega entradas a la tabla de importación del ejecutable, por lo que que una llamada a la función se redirige a esa DLL.

No necesita un archivo .lib para usar una biblioteca dinámica, pero sin uno no puede tratar las funciones de la DLL como funciones normales en su código. En su lugar, debe llamar manualmente LoadLibrarypara cargar la DLL (y FreeLibrarycuando haya terminado) y GetProcAddressobtener la dirección de la función o elemento de datos en la DLL. A continuación, debe convertir la dirección devuelta a un puntero a función adecuado para poder usarla.

Anthony Williams
fuente
4
Después de una larga búsqueda, en mi opinión, obtuve la mejor respuesta por la razón que usaba lib & dll. Gracias
Jeet
@Anthony Williams cuando dijo: "Para una biblioteca dinámica, el archivo .lib contiene una lista de las funciones exportadas y los elementos de datos de la biblioteca, e información sobre de qué DLL provienen", es ese archivo .lib llamado "importar biblioteca "que es diferente a los archivos .lib normales (" biblioteca estática ")?
Starriet
Sí, es una biblioteca de importación
Anthony Williams
13

Encontré la siguiente respuesta de Hans también útil aquí. Aclara el aire de que podría haber dos tipos de archivos lib.

Un archivo LIB se usa para construir su programa, solo existe en su máquina de construcción y no lo envía. Hay dos tipos. Una biblioteca de enlaces estáticos es una bolsa de archivos .obj, recopilados en un solo archivo. El vinculador selecciona cualquier fragmento de código del archivo cuando necesita resolver un identificador externo.

Pero más relevante para las DLL, un archivo LIB también puede ser una biblioteca de importación. Entonces es un archivo pequeño y simple que incluye el nombre de la DLL y una lista de todas las funciones exportadas por la DLL. Deberá proporcionárselo al vinculador cuando cree un programa que use la DLL para que sepa que un identificador externo es en realidad una función exportada por la DLL. El vinculador usa la biblioteca de importación para agregar entradas a la tabla de importación para el EXE. Lo que a su vez es utilizado por Windows en tiempo de ejecución para averiguar qué DLL deben cargarse para ejecutar el programa.

irsis
fuente
8

En una biblioteca estática, el archivo lib contiene el código de objeto real para las funciones proporcionadas por la biblioteca. En la versión compartida (a lo que se refirió como biblioteca dinámica vinculada estáticamente), solo hay código suficiente para establecer el vínculo dinámico en tiempo de ejecución.

No estoy seguro de las "bibliotecas dinámicas vinculadas dinámicamente" (cargadas mediante programación). ¿Incluso enlaza con un .lib en ese caso?

Editar:

Un poco tarde en llegar, pero no, no enlazas un .lib. Bueno, enlaza a la lib con libraryloaderex en ella. Pero para la biblioteca real que está utilizando, proporciona sus propios enlaces a través de punteros de función C y loadlibrary los completa.

He aquí un resumen:

Vinculación ǁ Estático | DLL | LoadLibrary
========= ǁ =============== | ====================== | = ==================
Código API ǁ En su com | En la DLL | En la DLL
vidas ǁ programa apilado | |
--------- ǁ --------------- | ---------------------- | - ------------------
Función ǁ Directo, mayo | Indirecto vía tabla | Indirecto a través de su
llamadas ǁ ser elididas | llenado automáticamente | propia función ptrs
--------- ǁ --------------- | ---------------------- | - ------------------
Burden ǁ Compilador | Compilador / SO | Tu / OS
Rueda dentada
fuente
por bibliotecas vinculadas estáticamente, me refiero a usar un archivo .lib y vincular el .dll en tiempo de compilación. El enlace dinámico está enlazando el .dll en tiempo de ejecución usando la función libraryloaderex () de la API de Win32.
Sulla
6

El vinculador lee un archivo lib y se usa un archivo dll durante la ejecución. Un archivo lib es esencialmente inútil durante la ejecución y un enlazador es incapaz de leer un archivo dll (excepto posiblemente de una manera irrelevante aquí).

Las diferencias entre el uso de archivos lib para enlaces estáticos y dinámicos pueden ser confusas, pero si comprende un poco de historia, se vuelve muy claro.

Originalmente solo existían bibliotecas estáticas. Para una biblioteca estática, el archivo .lib contiene archivos obj. Cada archivo obj es la salida de un solo archivo de entrada de código fuente del compilador. Un archivo lib es solo una colección de archivos obj relacionados, muy parecido a colocar archivos obj en un directorio. Eso es esencialmente lo que es un archivo lib, una biblioteca de archivos obj. Para un enlace estático, todos los archivos obj que utiliza un ejecutable se combinan en un solo archivo. Compare eso con un enlace dinámico en el que el ejecutable está en un archivo separado del otro código que usa.

Para implementar la vinculación dinámica, Microsoft modificó el uso de archivos lib de manera que se refieran a un archivo dll en lugar de ubicaciones en un archivo obj. Aparte de eso, toda la información que hay en una biblioteca para un enlace estático es la misma que para un enlace dinámico. Todos son iguales en cuanto a la información que contienen, excepto que un archivo lib para un enlace dinámico especifica el archivo dll.

user34660
fuente
1

En dll hay "cosas" como en un exe (puede haber cualquier tipo de datos, importaciones, exportaciones, secciones de lectura / escritura / ejecutables) pero la diferencia es que un archivo exe exporta solo el punto de entrada (función) pero el dll exporta uno / muchas funciones.

Quonux
fuente