¿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?
c++
dll
linker
static-libraries
Sulla
fuente
fuente
Respuestas:
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
LoadLibrary
para cargar la DLL (yFreeLibrary
cuando haya terminado) yGetProcAddress
obtener 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.fuente
Encontré la siguiente respuesta de Hans también útil aquí. Aclara el aire de que podría haber dos tipos de archivos lib.
fuente
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:
fuente
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.
fuente
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.
fuente