¿Cuál es la diferencia entre lib y dll? ¿Qué es una biblioteca de enlaces estáticos y qué es una biblioteca de enlaces dinámicos?
Las bibliotecas de enlaces estáticos y las bibliotecas de enlaces dinámicos son código privado. Si utiliza una biblioteca de enlaces estáticos, las instrucciones en lib se incluirán directamente en la versión final. archivo EXE generado. Sin embargo, si se utiliza una biblioteca de vínculos dinámicos, no es necesario incluir la biblioteca de vínculos dinámicos en el archivo EXE final generado, pero se puede hacer referencia a ella "dinámicamente" y descargarla cuando se ejecuta el archivo EXE, independientemente del archivo EXE. Otra diferencia entre bibliotecas estáticas y dinámicas es que las bibliotecas estáticas no pueden contener otras bibliotecas dinámicas o estáticas, mientras que las bibliotecas dinámicas pueden contener otras bibliotecas dinámicas o estáticas. La biblioteca dinámica es una función que se llama de acuerdo con la tabla de mapeo de funciones y luego se llama a la pila. Si el archivo dll en el proyecto actual llama a la misma función varias veces, solo quedará una copia de la función durante la ejecución. Sin embargo, si llama a la misma función varias veces en un archivo lib, la función dejará varias copias en el espacio de ejecución del programa actual, una para cada llamada.
La comparación general entre la biblioteca de enlaces estáticos y las reglas de llamada de la biblioteca de enlaces estáticos es la siguiente:
1. Biblioteca de enlaces estáticos (relativamente simple):
Primero, utilizar enlace estático Una biblioteca requiere los archivos de encabezado .h y los archivos .lib que generan la biblioteca, proporcionados por el desarrollador de la biblioteca. El formato de declaración del archivo de encabezado .h de la biblioteca generada es el siguiente:
El nombre de la función del tipo de retorno de la función externa "C" (lista de parámetros);
En el .cpp archivo de código fuente del programa que llama. El formato de declaración es el siguiente:
#include "./lib.h"
#pragma comment(lib, ". //debug/ /libTest.lib") //Especificar enlace con bibliotecas estáticas
En segundo lugar, porque la biblioteca estática contiene todas las instrucciones en el archivo EXE generado por el programa que llama. Entonces, si usa una biblioteca estática, no existe algo así como "exportar una función para que la use el usuario", ¡debe usar todas las bibliotecas estáticas! ¡O no lo uses!
2. Biblioteca de enlaces de estado:
El uso de una biblioteca de enlaces dinámicos requiere que el desarrollador de la biblioteca proporcione los archivos .lib y .dll generados. O simplemente proporcione archivos dll.
En primer lugar, debemos tener en cuenta que existen dos tipos de funciones en la biblioteca de enlaces dinámicos:
1) Funciones externas, que las aplicaciones pueden llamar
2) Funciones internas de LL, solo pueden ser utilizadas por programas de biblioteca de enlaces dinámicos y no pueden ser invocadas por aplicaciones.
Entonces, si el programa que llama quiere llamar a una función en una DLL, debe especificar de alguna forma la función que se llamará.
Para exportar archivos DLL, puede utilizar los siguientes métodos:
#ifdef WLL_EXPORTS
#define WLL_API __declspec(dllexport)
# else
#define WLL_API__declspec(dllexport)
#else
#define WLL_API__declspec(dllimport)
#endif
Esta es la definición de macro de la clase exportada. Esta definición de macro debe agregarse para exportar la clase exportada.
WLL_EXPORTS aquí aparecerá en la definición del preprocesador de projectàsettingsàCàPreProcessor, y esta MACRO indica que quiere definir la macro de exportación.
Al compilar la biblioteca actual, la clase a la que se agrega WLL_API se exportará y cualquier otra DLL o EXE que llame y que contenga este encabezado se considerará que importa la clase porque no define la macro WLL_API. .
Los pasos principales para utilizar enlaces estáticos para llamar a funciones de biblioteca de enlaces dinámicos son los siguientes:
Incluir el archivo de encabezado exportado en la DLL.
Utilice #pragma comment(lib, ". //debug//libTest.lib") para importar el archivo de encabezado *.lib generado por la biblioteca de enlaces dinámicos. O agregue el archivo lib a Dependencias adicionales en projectàsettingsàLinkeràInput.
Coloque el archivo *.dll generado por la biblioteca de vínculos dinámicos en el mismo directorio que el EXE o DLL. También puede utilizar llamadas de carga dinámica, los pasos son los siguientes:
Otro.dll tiene una función int Add(int x, int y). Entonces el proceso de llamada completo es el siguiente:
typedef int (* FunPtr) (int, int); //Definir puntero de función
FunPtr funPtr;
Manejar handle =LoadLibrary("Another.dll");
funPtr = (FunPtr)GetProcAddress(handle, "Add"); 3;
FreeLibrary(handle); // Libera la biblioteca de enlaces dinámicos cargada
archivo LIB
Actualmente hay dos bibliotecas con el sufijo lib, una es Biblioteca estática (en lo sucesivo, "biblioteca estática"), la otra es la biblioteca de importación (en lo sucesivo, "biblioteca de importación") de la biblioteca de enlaces dinámicos (en lo sucesivo, "biblioteca de enlaces dinámicos"). Biblioteca (en adelante, "biblioteca de importación").
Una biblioteca estática es un paquete compuesto por uno o más archivos obj, por lo que algunas personas simplemente llaman al proceso de generar una biblioteca a partir de archivos obj Archivo, es decir, fusionarlos. Por ejemplo, si vincula una biblioteca estática, si ocurre un error en ella, descubrirá exactamente qué obj tiene el problema, es decir, la biblioteca estática es solo un shell.
Las bibliotecas dinámicas generalmente tienen bibliotecas de importación correspondientes para facilitar que el programa cargue estáticamente la biblioteca DLL. De lo contrario, es posible que necesite usar LoadLibary para llamar el archivo DLL usted mismo y luego usar GetProcAddress manualmente para obtener la función correspondiente. . Con una biblioteca importada, simplemente vincula la biblioteca importada y llama a la función según la declaración de la interfaz de la función en el archivo de encabezado.
Existe una gran diferencia entre las bibliotecas de importación y las bibliotecas estáticas; son cosas esencialmente diferentes. La biblioteca estática contiene el código real, la tabla de símbolos, etc., mientras que la biblioteca de importación contiene el código real en la biblioteca dinámica. La biblioteca de importación solo contiene la tabla de símbolos de direcciones, etc. para garantizar que el programa pueda encontrar información básica sobre direcciones. de la función correspondiente.
Esta también es la forma habitual de publicar una gran cantidad de código fuente abierto:
1. Paquete precompilado: contiene algunos archivos .dll y algunos archivos .lib. El .lib se importa a la biblioteca y no debe confundirse con una biblioteca estática. Pero el método de importación es el mismo que el de las bibliotecas estáticas. La ruta de búsqueda de estos .lib debe agregarse a la ruta del enlace. Por otro lado, es mejor colocar el .dll en el mismo directorio que el ejecutable final de la aplicación generada. De esta manera, cuando ejecute la aplicación, la biblioteca de enlaces dinámicos se llamará automáticamente.
2. Autocompilación del usuario: descargue el código fuente y compílelo usted mismo de acuerdo con el archivo Léame.
Es probable que el archivo de biblioteca generado también sea un archivo de biblioteca .dll .lib (en la biblioteca)
3 Si solo tiene un dll y conoce el prototipo de función en el dll, puede usar LoadLibary directamente. en su propio programa Llame al archivo DLL de la biblioteca, obtenga la dirección de la función a través de GetProcAddress y luego llámelo.
Archivo DLL
Una biblioteca de vínculos dinámicos (DLL) es un archivo ejecutable que sirve como biblioteca para que *** lo disfrute. Los enlaces dinámicos proporcionan una forma para que un proceso llame a funciones que no forman parte de su código ejecutable. El código ejecutable de una función se encuentra en una biblioteca de vínculos dinámicos que contiene una o más funciones que han sido compiladas, vinculadas y almacenadas por separado de los procesos que las utilizan. Varias aplicaciones pueden acceder simultáneamente al contenido de una copia de una DLL en la memoria.
El enlace dinámico se diferencia del enlace estático en que permite que un módulo ejecutable (archivo .dll o archivo .exe) contenga sólo la información necesaria para localizar el código ejecutable para la funcionalidad DLL en tiempo de ejecución. En la vinculación estática, el vinculador obtiene todas las funciones a las que se hace referencia de la biblioteca vinculada estáticamente y coloca la biblioteca junto con el código en el archivo ejecutable.
El uso de bibliotecas de vínculos dinámicos en lugar de bibliotecas de vínculos estáticos tiene muchas ventajas: DLL puede ahorrar memoria, reducir las operaciones de intercambio, ahorrar espacio en disco, es más fácil de actualizar, proporciona soporte posventa y proporciona un mecanismo para extender MFC clases de biblioteca, admite programas en varios idiomas y facilita la creación de versiones internacionales.
API es una interfaz de programación de aplicaciones. Es un conjunto de funciones que se pueden utilizar para operar un componente, aplicación o sistema operativo. Normalmente, una API consta de una o más DLL que proporcionan una funcionalidad específica.
Una DLL es un archivo que contiene funciones que pueden ser invocadas por cualquier aplicación que se ejecute en Microsoft Windows. En tiempo de ejecución, las funciones de una DLL están vinculadas dinámicamente a la aplicación que la llama. No importa cuántas aplicaciones llamen a una función en una DLL, solo hay un archivo en el disco que contiene la función y la DLL solo se crea cuando la función se llama a la memoria. La API de la que probablemente oiga hablar más es la API de Windows, que consta de las distintas DLL que componen el sistema operativo Windows. La API de Windows garantiza que todas las aplicaciones que se ejecutan en Windows se comporten de la misma manera.
Windows 3.1 usa la API Win16 y las plataformas Microsoft Windows NT, Windows 95 y Windows 98 usan la API Microsoft Win32. Además de la API de Windows, se han lanzado varias otras API. Por ejemplo, la interfaz de programación de aplicaciones de correo (MAPI) es un conjunto de archivos DLL que se pueden utilizar para escribir aplicaciones de correo electrónico. La API se ha escrito tradicionalmente para programadores de C y C que desarrollan aplicaciones de Windows, pero otros lenguajes de programación, incluido VBA, también pueden llamar funciones en la DLL. Debido a que la mayoría de las DLL están escritas y documentadas principalmente para programadores de C y C, llamar a funciones DLL es diferente a llamar a funciones VBA. Al utilizar la API, es importante comprender cómo pasar argumentos a funciones DLL.
Advertencia: Las llamadas a la API de Windows y otras funciones DLL pueden tener efectos adversos en su aplicación. Cuando llama a funciones DLL directamente desde su propio código, omite algunos de los mecanismos de seguridad que normalmente proporciona VBA. Si comete un error al definir o llamar a una función DLL (que todos los programadores no pueden evitar), puede provocar un error de aplicación (también conocido como "fallo de protección general" o GPF). La mejor solución es guardar el proyecto antes de ejecutar el código y asegurarse de comprender cómo funcionan las llamadas a funciones DLL.