Nueva biblioteca de enlaces dinámicos de Qt y carga explícita

Nuevo archivo dll

El primer paso es crear un nuevo archivo de proyecto, seleccione Biblioteca ---- Biblioteca C++
inserte la descripción de la imagen aquí
El segundo paso, seleccione Biblioteca compartida, aquí Qt Creator genera una clase por defecto, el nombre personalizado es AddFun
inserte la descripción de la imagen aquí
El tercer paso, puede ver, Qt generó dos archivos de encabezado y un archivo cpp, donde la declaración de la función se coloca principalmente en addfun.h, y la definición de la función está en el archivo addfun.cpp.
inserte la descripción de la imagen aquí
Declare la función en addfun.h (la clase se anota aquí porque el archivo dll encapsulado actualmente no necesita una clase, solo una función)

#ifndef ADDFUN_H
#define ADDFUN_H

#include "addFun_global.h"

#if 0
class ADDFUN_EXPORT AddFun
{
    
    
public:
    AddFun();
};
#endif

extern "C" void ReadCamera(int*);

#endif // ADDFUN_H

Defina la función ReadCamera en el archivo cpp y, de manera similar, comente el constructor de la clase

#include "addfun.h"

#if 0
AddFun::AddFun()
{
    
    
}
#endif

void ReadCamera(int *cameraNum)
{
    
    
    *cameraNum = 10;
}

Finalmente, ejecute el código
inserte la descripción de la imagen aquí
aquí y seleccione Cancelar, puede ver el archivo dll generado en la carpeta generada
inserte la descripción de la imagen aquí

Carga explícita de archivos dll por Qt

El primer paso es colocar el archivo dll en la carpeta donde se genera el exe.
En el segundo paso, la carga explícita de la dll de Qt utiliza principalmente QLibrary para
crear un nuevo proyecto testDll para verificar si la carga explícita de la dll es exitosa.
La interfaz ui se muestra en la figura. Cuando se presiona el botón, se ejecutan las funciones relacionadas con la carga de dll.
inserte la descripción de la imagen aquí
En el archivo de encabezado, se define un puntero de función para llamar a la función en el archivo dll.

#include <QWidget>
#include <QLibrary>   //显式加载DLL
typedef void (*FUNC)(int *cameraNum);

Implemente una llamada explícita en la función de ranura de botón del archivo cpp.

void testDll::on_pushButton_clicked()
{
    
    
     QLibrary library("addFun.dll");
    if(!library.load())
    {
    
    
        ui->ui_displayEdit->setText("error");
        return;
    }
    else
    {
    
    
         int camera=1;
         FUNC func = (FUNC)library.resolve("ReadCamera");
         if (!func)
         {
    
    
             ui->ui_displayEdit->setText("Resolve function failed!");
             return;
         }
         func(&camera);
         QString str=QString::number(camera);
         ui->ui_displayEdit->setText(str);
    }
}

El resultado final es
inserte la descripción de la imagen aquí
que la función en la dll se carga correctamente.

Algunas notas propensas a errores

  1. biblioteca.cargar () error

library.load(); el error generalmente se debe a no colocar correctamente el archivo dll y el archivo exe generado por el código en el mismo directorio

  1. biblioteca.resolve() error

library.resolve("ReadCamera"); El error aquí se debe principalmente al hecho de que la "C" externa
no se usa directamente al generar el archivo dll

void ReadCamera(int*);

De esta manera, el archivo dll compilado y generado por la computadora modificará el nombre de la función. No se agrega ninguna "C" externa aquí. Usando el software de análisis de dll, se puede ver que
ReadCamera se ha convertido en _Z10ReadCameraPi, por lo que resolve no encontrará el función Leer cámara.
inserte la descripción de la imagen aquí
Por lo tanto, para evitar que el nombre de la función cambie después de la compilación, se debe agregar una "C" externa al proyecto que genera la dll.

extern "C" void ReadCamera(int*);

Supongo que te gusta

Origin blog.csdn.net/qq_43376782/article/details/124416326
Recomendado
Clasificación