Nuevo archivo dll
El primer paso es crear un nuevo archivo de proyecto, seleccione Biblioteca ---- Biblioteca C++
El segundo paso, seleccione Biblioteca compartida, aquí Qt Creator genera una clase por defecto, el nombre personalizado es AddFun
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.
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
aquí y seleccione Cancelar, puede ver el archivo dll generado en la carpeta generada
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.
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
que la función en la dll se carga correctamente.
Algunas notas propensas a errores
- 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
- 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.
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*);