una turbo tipos sirve que programacion para librerias libreria informatica funciones entre diferencia clases bibliotecas biblioteca c++ dll linker static-libraries

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



que es una libreria en programacion y para que sirve (5)

¿Qué hay dentro de un archivo .lib de la biblioteca estática, biblioteca dinámica enlazada 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 los enlaces estáticos, el archivo .lib no es más que un archivo .obj con todos los métodos. ¿Es eso correcto?


El enlazador lee los archivos 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 confusos, pero si comprende un poco de historia, entonces queda muy claro.

Originalmente solo había bibliotecas estáticas. Para una biblioteca estática, el archivo .lib contiene archivos obj. Cada archivo obj es el resultado 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 poner 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 usa un ejecutable se combinan en un archivo. Compare eso con un enlace dinámico en el que el ejecutable está en un archivo separado del otro código que utiliza.

Para implementar enlaces dinámicos, Microsoft modificó el uso de archivos lib de modo que hagan referencia a un archivo dll en lugar de ubicaciones en un archivo obj. Aparte de eso, toda la información que está en una biblioteca para un enlace estático es la misma que para un enlace dinámico. Son todos iguales en cuanto a la información en ellos excepto que un archivo lib para un enlace dinámico especifica el archivo dll.


En dll''s 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 exporta uno / muchas funciones.


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 (lo que usted denomina biblioteca dinámica enlazada estáticamente), existe suficiente código para establecer el enlace dinámico en tiempo de ejecución.

No estoy seguro acerca de "bibliotecas dinámicas vinculadas dinámicamente" (cargadas programáticamente). ¿Incluso vinculas con un .lib en ese caso?

Editar:

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

Aquí hay un resumen:

Linking ǁ Static | DLL | LoadLibrary =========ǁ===============|======================|=================== API code ǁ In your com- | In the DLL | In the DLL lives ǁ piled program | | ---------ǁ---------------|----------------------|------------------- Function ǁ Direct, may | Indirect via table | Indirect via your calls ǁ be elided | filled automatically | own function ptrs ---------ǁ---------------|----------------------|------------------- Burden ǁ Compiler | Compiler/OS | You/OS


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

Un archivo LIB se utiliza para construir su programa, solo existe en su máquina de compilación y no lo envía. Hay dos tipos. Una biblioteca de enlaces estáticos es una bolsa de archivos .obj, recopilados en un único 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. Es entonces un archivo pequeño y simple que incluye el nombre de la DLL y una lista de todas las funciones exportadas por la DLL. Tendrá que proporcionarlo al enlazador cuando construya un programa que use la DLL para que sepa que un identificador externo es realmente 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. Que a su vez es utilizado por Windows en tiempo de ejecución para averiguar qué archivos DLL se deben cargar para ejecutar el programa.


Para una biblioteca estática, el archivo .lib contiene todo el código y los datos de la biblioteca. El vinculador 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 acerca de la DLL de la que provienen. Cuando el vinculador construye el ejecutable final, si se utiliza cualquiera 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 para 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 a LoadLibrary para cargar la DLL (y FreeLibrary cuando haya terminado), y GetProcAddress para 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 apropiado para poder usarla.