Acerca de dllexport y dllimport de la biblioteca dinámica c ++

Primero recomiende una herramienta de programación auxiliar que sea mejor que Microsoft Coplilot - Cursor, una nueva generación de artefacto de programación auxiliar basada en GPT4 - Cursor, el sitio web oficial dice que coopera con OpenAI y está basado en GPT4. Lo he experimentado yo mismo, es realmente bueno, vale la pena probarlo.

Dirección del sitio web oficial:

Cursores | Construir rápido

En cuanto al uso de las palabras clave dllexport y dllimport de la biblioteca dinámica. Cuándo usar dllexport y cuándo usar dllimport.

dllexportar y dllimportar

es una palabra clave utilizada para exportar e importar funciones y datos en una biblioteca de vínculos dinámicos (DLL). En el sistema operativo Windows, una biblioteca de vínculos dinámicos es un archivo binario reubicable que contiene código y datos que varias aplicaciones pueden compartir. El uso de bibliotecas de vínculos dinámicos puede reducir el tamaño de los archivos ejecutables, pero también mejorar la reutilización y el mantenimiento del código.

exportar dll

Se utiliza para exportar funciones o datos a una DLL para que otras aplicaciones puedan usarlos. Por ejemplo, si escribe un programa llamado

MyFunction y márquelo como dllexport, luego otras aplicaciones pueden usar las funciones LoadLibrary y GetProcAddress para cargar y llamar a la función.

importar dll

Se utiliza para importar funciones o datos de una DLL para que su aplicación pueda utilizarlos. Por ejemplo, si desea usar una función en otra DLL en su aplicación, puede marcar la función como dllimport y usarla en su código.

Cuando utilice dllexport y dllimport, debe prestar atención a los siguientes puntos:

  • dllexport y dllimport solo se pueden usar en el sistema operativo Windows.

  • dllexport y dllimport solo se pueden usar en bibliotecas de vínculos dinámicos (DLL).

  • dllexport y dllimport solo se pueden usar para exportar e importar funciones y datos.

  • La sintaxis de dllexport y dllimport es la misma, pero el uso es diferente.

  • Tanto dllexport como dllimport requieren que se especifique el nombre y la visibilidad de una función o datos.

  • Tanto dllexport como dllimport pueden especificar la convención de llamada para funciones o datos.

  • Tanto dllexport como dllimport pueden especificar la clase de almacenamiento de funciones o datos.

El archivo lib generado por dllexport puede ser una biblioteca estática o una biblioteca de importación. El archivo .lib generado contiene información sobre funciones exportadas e información utilizada para resolver direcciones de función en el momento del enlace. Si marca la función exportada como dllexport, el compilador generará un archivo .lib que contiene información sobre la función exportada. Si marca la función importada como dllimport, el compilador generará un archivo .lib que contiene información sobre la función importada.

La función del archivo .lib es resolver direcciones de función en el momento del enlace. Cuando escribe una aplicación y llama a una función en una biblioteca de vínculos dinámicos, el compilador no sabe dónde está la dirección de la función. Por lo tanto, el compilador genera una tabla de símbolos que contiene los nombres de las funciones y la guarda en el archivo .obj. Cuando vincula su aplicación, el vinculador busca el nombre de la función en la tabla de símbolos y lo reemplaza con la dirección de la función. Si está utilizando una biblioteca enlazada estáticamente, el enlazador simplemente copiará el código de la función en la aplicación. Si está utilizando una biblioteca de importación, el enlazador cargará funciones desde la DLL en tiempo de ejecución.

Para usar un archivo .lib, debe incluirlo en la línea de comandos del enlazador. Por ejemplo, si tiene una DLL llamada MyLibrary y desea usar funciones de ella en su aplicación, puede usar la siguiente línea de comando:

Entre ellos, la opción /I se usa para especificar la ruta de búsqueda de archivos de encabezado, la opción /link se usa para especificar el enlazador y la opción /LIBPATH se usa para especificar

La ruta de búsqueda de archivos .lib, MyApplication.cpp es el archivo fuente de su aplicación y MyLibrary.lib es la biblioteca de importación de su DLL.

Q_DECL_IMPORT和Q_DECL_EXPORT

Estas son dos definiciones de macros en Qt, que se utilizan para realizar la importación y exportación de bibliotecas de vínculos dinámicos en diferentes plataformas. En la plataforma Windows, la importación y exportación de la biblioteca de vínculos dinámicos debe usar las palabras clave __declspec(dllexport) y __declspec(dllimport), mientras que en la plataforma Linux debe usar __attribute__((visibility("default"))) palabra clave

Para facilitar el desarrollo multiplataforma, Qt define las macros Q_DECL_IMPORT y Q_DECL_EXPORT, que se definirán como diferentes palabras clave en diferentes plataformas, realizando así la importación y exportación de bibliotecas de enlaces dinámicos multiplataforma.

Q_DECL_IMPORTAR

Se usa para declarar funciones o variables importadas de una biblioteca de enlaces dinámicos, que generalmente se usa en archivos de encabezado. En la plataforma Windows, Q_DECL_IMPORT se definirá como __declspec(dllimport), en la plataforma Linux se definirá como una macro vacía. El uso de Q_DECL_IMPORT puede hacer que las funciones y variables en el archivo de encabezado se importen correctamente en diferentes plataformas.

Q_DECL_EXPORTAR

Se usa para declarar una función o variable exportada de una biblioteca de vínculos dinámicos, que generalmente se usa en archivos fuente. En la plataforma Windows, Q_DECL_EXPORT se definirá como __declspec(dllexport), en la plataforma Linux se definirá como __attribute__((visibility("default"))).

El uso de Q_DECL_EXPORT puede hacer que las funciones y variables del archivo fuente se exporten correctamente en diferentes plataformas.

La biblioteca dinámica dll no proporciona un archivo lib, ¿cómo usarlo?

Si la biblioteca dll y el archivo lib correspondiente se proporcionan al mismo tiempo, el uso de la biblioteca dinámica es muy simple y el compilador puede cargarlo globalmente cuando se vincula. Si solo tiene un archivo DLL, pero no un archivo LIB, puede usar la función LoadLibrary para cargar el archivo DLL y obtener el puntero de función. Este método se llama vinculación dinámica. Aquí hay un ejemplo:

#include <windows.h>
#include <iostream>

typedef int (*MYPROC)(int);

int main() {
    HINSTANCE hinstLib;
    MYPROC ProcAdd;

    hinstLib = LoadLibrary(TEXT("MyDll.dll"));
    if (hinstLib != NULL) {
        ProcAdd = (MYPROC)GetProcAddress(hinstLib, "MyFunction");
        if (ProcAdd != NULL) {
            int result = ProcAdd(1);
            std::cout << "Result: " << result << std::endl;
        } else {
            std::cout << "Could not find function" << std::endl;
        }
        FreeLibrary(hinstLib);
    } else {
        std::cout << "Could not load library" << std::endl;
    }

    return 0;
}

En este ejemplo, usamos la función LoadLibrary para cargar el archivo MyDll.dll. Luego, usamos la función GetProcAddress para obtener la dirección de la función MyFunction. Finalmente, lanzamos el puntero de función para escribir MYPROC y lo llamamos para ejecutar la función.

referencias:

Cursores | construir rápido

Una mejor herramienta de programación auxiliar que Microsoft Coplilot - Cursor - Programmer Sought

Supongo que te gusta

Origin blog.csdn.net/qq8864/article/details/129705375
Recomendado
Clasificación