Qt6 llama a la biblioteca de enlaces dinámicos dll generada por vc en Windows

Qt es una herramienta multiplataforma y obviamente funciona con bibliotecas dinámicas de Windows.

En el sistema operativo Windows, las bibliotecas existen en forma de archivos y se pueden dividir en dos tipos: biblioteca de enlaces dinámicos (DLL) y biblioteca de enlaces estáticos. El control de archivo de la biblioteca de vínculos dinámicos tiene el nombre de sufijo .dll y el control de archivo de la biblioteca de vínculos estáticos tiene el nombre de sufijo .lib. Ya sea una biblioteca de enlaces dinámicos o una biblioteca de enlaces estáticos, proporciona variables, funciones o parámetros a sus llamadores.

En esencia, la biblioteca del sistema de Windows se basa principalmente en la biblioteca dinámica dll, por lo que habrá una gran cantidad de archivos de biblioteca que terminan en dll en C:\Windows\System32.

⚠️Los conceptos teóricos debajo de las ventanas son más adecuados para que los digieran los recién llegados, ¡y los jefes deberían pasarlos por alto!

 1. Describa brevemente la biblioteca de vínculos dinámicos

El código fuente de la biblioteca de vínculos dinámicos es la implementación específica de la función o clase. Después de compilar el código fuente, se generará un archivo con el sufijo dll. Este archivo es el archivo de la biblioteca de vínculos dinámicos, que es un archivo binario. No se puede ejecutar de forma independiente, sino que debe combinarse con él. Por lo general, puede proporcionar variables, funciones o clases a sus llamadores .

1. La persona que llama (o usuario) puede ser un programa de aplicación (programa exe) u otra biblioteca de enlace dinámico;

2. La función proporcionada a la persona que llama generalmente se denomina función exportada;

3. La clase proporcionada a la persona que llama generalmente se denomina clase exportada.

Después de compilar la biblioteca de enlaces dinámicos, se generará un control de archivo .lib y un archivo .dll. El archivo .lib aquí no se refiere al archivo de biblioteca de enlaces estáticos, sino al archivo de biblioteca de importación. Aunque el nombre del sufijo es el mismo como el control de archivo de biblioteca de enlace estático, los dos o no tienen relación.

En cuanto a la llamada, hay dos diferencias:

Enlace implícito: cuando se ejecuta el programa, el archivo DLL se carga en la aplicación;

Enlace explícito: la aplicación puede agregar archivos DLL en cualquier momento durante la ejecución y también puede desinstalar archivos DLL en cualquier momento, lo que no se puede hacer mediante enlaces implícitos, por lo que los enlaces de visualización tienen una mayor flexibilidad y son más adecuados para palabras explicativas.

El archivo de biblioteca de importación .lib almacena el nombre y la dirección de la función exportada en el control de documento DLL. Cuando el programa de aplicación utiliza la biblioteca de enlace dinámico de enlace implícito , importará el contenido del control de documento de biblioteca (el nombre y la dirección del función o clase exportada) Cópielo en el código de la aplicación, cuando la aplicación se ejecuta, puede conocer la dirección de la función (o clase) exportada en la biblioteca de vínculos dinámicos.

 Dos, la clasificación de la biblioteca de enlaces dinámicos dll

En pocas palabras, las DLL se dividen en DLL que no son de MFC (también conocidas como DLL de Win 32) y DLL de MFC .

DLL no MFC (DLL no MFC), también conocida como DLL Win32 , se refiere a una DLL escrita directamente en C o C++ sin la estructura de la biblioteca de clases MFC. Las funciones exportadas son interfaces C o C++ estándar, que pueden ser utilizadas por -MFC o Llamado por aplicaciones escritas en MFC. Si la DLL establecida no necesita usar MFC, se debe establecer una DLL que no sea MFC, ya que el uso de MFC aumentará el tamaño de la biblioteca del usuario y desperdiciará el espacio de memoria y disco del usuario.

DLL de MFC significa que la biblioteca MFC de Microsoft se puede usar dentro de esta DLL, que no está dentro del alcance de este artículo;

3. Desarrollo y llamada de DLL de la biblioteca de vínculos dinámicos

Para una DLL útil, las variables, funciones o clases en la DLL primero deben exportarse y luego compilarse para generar un archivo dll. Exportar es la declaración de variables, funciones o clases para ser utilizadas por programas externos.

Normalmente hay dos métodos de exportación:

La primera forma es exportar a través de la palabra clave declspec(dllexport);

La otra es usar el archivo de definición del módulo .def para importar el archivo (en la mayoría de los casos, rara vez se usa sin demostración);

No importa qué método se utilice para compilar, eventualmente se generarán archivos dll y archivos lib (archivos de biblioteca de importación).

3.1 Exportar por palabra clave declspec (dllexport)

Utilice la palabra clave declspec(dllexport) para exportar datos, funciones, clases o funciones de miembro de clase desde una DLL. Este método es relativamente simple, simplemente agregue declspec (dllexport) antes del contenido exportado. El primer tipo se demuestra en el siguiente vs:

(1), VS nueva biblioteca de enlaces dinámicos DLL;

 (2), Nombre del proyecto, marque para poner la solución y el proyecto en el mismo directorio;

 (3), dllmain.cpp se abrirá de forma predeterminada, simplemente ciérrelo directamente;

 (4), proyecto, botón derecho del ratón, añadir, clase;

(5), ingrese el nombre de la clase;

 

(5), AddDll.h y AddDll.cpp son los siguientes;

Nota: "__declspec (dllexport)" se agrega delante de la declaración de tipo. ¿Por qué no se usa una clase aquí? Se mide que la dll win32 llamada por QLibrary debe estar en lenguaje c. Si es C++, se debe usar qt para crear el dll en sí.  

 

 

 

(6) En general, al final se requiere la versión Release.Aquí cambio Debug a Release, y luego la genero;

(7), en el directorio de lanzamiento del proyecto, busque el archivo dll de biblioteca de vínculos dinámicos y el archivo lib (archivo de biblioteca de importación) que necesitamos

 3.2 Llamar dll a través de Qt

Hay 4 formas para que Qt llame a la función exportada de DLL:

El primero es usar la API de Win32:

La segunda es usar la propia API de Qt:

El tercero es llamar a la DLL directamente:

El cuarto es el método de llamada visual Qt Creator, simplemente haga clic con el mouse.

(1), usando win32api

Este método usa principalmente la función api LoadLibrary() de win 32. Este método se ha usado menos, y aquellos que estén interesados ​​pueden consultar lo siguiente;

(4 mensajes) 3. Use la API Win32 para llamar a DLL_api para llamar al método dllicono-predeterminado.png?t=N4P3

(2), utilizando la propia clase QLibrary de la función API de Qt

Este método es uno de los más comunes, como sigue:

Cabe señalar que en la función QLibrary::resolve, se establece claramente que el símbolo debe exportarse desde la biblioteca como una función C.

#include "mainwindow.h"

#include <QApplication>
#include <QLibrary>
#include <QDebug>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QLibrary lib;
    QString str1 = QApplication::applicationDirPath();
    qDebug()<<"str1="<<str1;
    QString str(str1+"/DllTest.dll" );
    lib.setFileName(str);
    if(lib.load())
    {
         typedef int(*AddFunction)(int a,int b);
         AddFunction Add = reinterpret_cast<AddFunction>(lib.resolve("MyAdd"));
         if(!Add)
         {
             qDebug()<<"resolve failed="<<lib.errorString();
         }
         else
         {
             int out=Add(1,3);
             qDebug()<<"out="<<out;
         }
    }
    else
    {
          qDebug()<<"load failed!";
    }

    MainWindow w;
    w.show();
    return a.exec();
}

 (3), llamando directamente a la dll

En este caso es lo más conveniente, pero necesita 3 archivos, una lib, una dll y un archivo .h (dll fuente)

① Copie lib en el directorio .pro de qt, como se muestra en la figura;

 ② Copie el dll en el directorio de sesión donde se genera el exe;

 ③Consulte .lib en el archivo .pro de qt, el método de referencia es el siguiente, -l su nombre de archivo lib;

LIBS+=-L$$PWD/./ -lDllPrueba

El frente indica el directorio actual bajo la ruta absoluta. Solo necesita modificar el nombre de la biblioteca más tarde. Por ejemplo, su biblioteca es test123.lib, y la cola debe ser -ltest123. Después de cambiar el archivo pro, recuerde presionar ctrl r para dejar que qt se recargue;

④Agregue el archivo de encabezado de la dll de origen. En principio, se recomienda crear un nuevo .h con el mismo nombre que .lib, lo que puede evitar la codificación y otros problemas. Como se muestra en la figura a continuación, primero haga clic con el botón derecho en el proyecto , agregue un nuevo archivo y luego el archivo de encabezado C/C++, ingrese el nombre de lib y, finalmente, copie la función del archivo de encabezado en el dll de origen y elimine __declspec (dllexport);

 

 

 ⑤Incluya el archivo de encabezado creado en el paso anterior, simplemente llame a la función directamente;

(4), método de llamada visual Qt Creator

Este método es similar al tercero anterior, y también requiere .dll y .lib, y un nuevo archivo de encabezado .h, pero esta ventaja es que qt resolverá automáticamente la modificación del archivo .pro.

Estos tres pasos ①②④ se pueden llevar a cabo primero, el contenido es el mismo que el del tercer método, copie el dll y .lib en la ubicación correspondiente, cree un nuevo archivo .h con el mismo nombre que el .lib y complete el contenido .

③Este paso es ligeramente diferente, como se muestra en la figura a continuación, haga clic derecho en el proyecto, agregue biblioteca, biblioteca externa, luego de seleccionar . , obtiene el doble de resultado con la mitad del esfuerzo.

 

 ⑤ Este paso es en realidad el mismo, incluido el archivo de encabezado, simplemente llámelo directamente;

 

El enfoque de este artículo es discutir el dll generado por qt llamando a vc. En cuanto a las llamadas más flexibles entre vc, puede consultar el siguiente artículo

(4 mensajes) Utilice archivos .dll de la biblioteca de enlaces dinámicos en Qt y VS----en un enlace implícito mode_qt vs dll_coffee y oolong's blog-CSDN blog https://blog.csdn.net / icono-predeterminado.png?t=N4P3qq_40459977/article/details/125652187  Originalidad no es fácil, si es útil, preste atención y continúe generando más contenido relacionado con qt6.

Supongo que te gusta

Origin blog.csdn.net/yanchenyu365/article/details/131046583
Recomendado
Clasificación