• qt使用动态库(DLL)


    本文主要讲解在QT开发环境中如何使用VC生成的DLL及QT自身生成的DLL。至于其它情况本文不作讨论。

    连接库分为2种

    (1)动态连接库,通常有.h .lib .dll三个文件,功能实现在dll中
    (2)静态连接库,通常有.h .lib二个文件,功能实现在lib中
    由上可以看出动态库的lib和静态库的lib文件是不同的。
        如果使用生成连接库的开发环境与使用连接库的开发环境相同,一般不会出什么问题,如VC写的连接库
    (包括动态库和静态库)还在VC中用一般不会有什么问题的。有时候我们需要DLL跨开发环境,如以前VC下的
    DLL想在QT中用。有网友说QT不支持VC生成的静态库,所以只测试QT使用动态库的情况。
    【先看VC生成的DLL】
    使用VC6建立Win32 dynamic-link library工程,工程中只有两个文件,编译即可生成DLL和LIB
     
    ////////////////////////////////// MFCDLL.h  /////////////////////////////////////
    #ifndef _MFCDLL_H
    #define _MFCDLL_H
    
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    #ifdef DLL
        // do nothing
    #else
    #define DLL __declspec(dllimport)
    #endif
    
    DLL void hello();
    DLL int add(int a, int b);
    
    #ifdef __cplusplus
    }
    #endif
    
    #endif
    ////////////////////////////////// MFCDLL.cpp  /////////////////////////////////////
    #define DLL __declspec(dllexport)
    #include "MFCDLL.h"
    #include <windows.h>
    
    void hello()
    {
    ::MessageBox(NULL, "hello world!", 
    "greeting", MB_OK);
    }
    
    int add(int a, int b)
    {
    return a + b;
    }

    【使用QT生成DLL】使用QT建立动态库工程,编译即可得到DLL(无LIB文件)

    ////////////////////////////////// qtdll_global.h  //////////////////////////////
    #ifndef QTDLL_GLOBAL_H
    #define QTDLL_GLOBAL_H
    
    #include
    
    #if defined(QTDLL_LIBRARY)
    #  define QTDLLSHARED_EXPORT Q_DECL_EXPORT
    #else
    #  define QTDLLSHARED_EXPORT Q_DECL_IMPORT
    #endif
    
    #endif // QTDLL_GLOBAL_H
    ////////////////////////////////// qtdll.h  /////////////////////////////////////
    #ifndef QTDLL_H
    #define QTDLL_H
    
    #include "qtdll_global.h"
    
    class QTDLLSHARED_EXPORT QTDLL
    {
    public:
        QTDLL();
    
    public:
        int add(int a, int b);
    };
    
    #endif // QTDLL_H
    ////////////////////////////////// qtdll.cpp  ///////////////////////////////////
    #include "qtdll.h"
    
    
    QTDLL::QTDLL()
    {
    }
    
    int QTDLL::add(int a, int b)
    {
        return a + b;
    }

    【QT显式加载VC生成的DLL】

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <QLibrary>
    #include <QDebug>
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    
        // DLL显式加载,只需要DLL文件即可,不需要.H和.LIB文件
        // 需要将DLL放到可执行目录中
        typedef void(*FUN1)();
        typedef int(*FUN2)(int, int);
    
        QLibrary lib("MFCDLL.dll");
        if (lib.load()) {
            qDebug() << "load ok!";
    
            FUN1 hello = (FUN1)lib.resolve("hello");
            FUN2 add = (FUN2)lib.resolve("add");
            if (hello) {
                qDebug() << "load hello ok!";
                hello();
            }
            if (add) {
                qDebug() << "load add ok!";
                qDebug() << add(3, 5);
            }
        } else {
            qDebug() << "load error!";
        }
    }

    【QT隐式加载VC生成的DLL】

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include "lib/MFCDLL.h"
    #include <QDebug>
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    
        // DLL隐式加载,只需要.DLL .H和.LIB文件
        // 1需要将DLL放到可执行目录中
        // 2将LIB路径设置到项目PRO文件中
        // 3将头文件包含进来,如果不包含需要自已声明函数原型及来源(本质与包含头文件相同)
        hello();
        qDebug() << add(5, 6);
        qDebug() << "ok";
    }

    pro工程文件中要设置LIB文件路径

    # lib文件路径
    LIBS += "F:/lib/MFC_DLL_TEST_WITH_QT_2/lib/MFCDLL.lib"

    【QT使用QT生成的动态库,隐式】

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <QDebug>
    #include "lib/qtdll.h"
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    
        // QT使用QT生成的DLL
        // 1. 包含头文件
        // 2. 在工程文件中指定lib路径
        // 3. 将动态库拷贝到可执行文件目录
        QTDLL dll;
        qDebug() << dll.add(3, 5);
    }

    pro工程文件中的设置

    LIBS += "F:/lib/QT_DLL_TEST_WITH_DLL/lib/QTDLL.dll"
  • 相关阅读:
    记忆力:记忆分类
    范例-项目-.NET-PetShop-4.0-数据库设计:MSPetShop4Service
    范例-项目-.NET-PetShop-4.0-数据库设计:MSPetShop4Profile
    范例-项目-.NET-PetShop-4.0-数据库设计:MSPetShop4Order
    范例-项目-.NET-PetShop-4.0-数据库设计:MSPetShop4
    范例-项目-.NET-PetShop-4.0-架构设计:PetShop 4.0架构与技术分析(2)
    范例-项目-.NET-PetShop-4.0-架构设计与技术分析:PetShop 4.0架构与技术分析(1)
    Error-Javascript:Uncaught Error: Malformed UTF-8 data at Object.stringify (crypto-js.js:478) at WordArray.init.toString (crypto-js.js:215)
    System.Diagnostics.Stopwatch.cs
    开发软件-服务器:Apache Tomcat
  • 原文地址:https://www.cnblogs.com/Y1Focus/p/4047555.html
Copyright © 2020-2023  润新知