Qt之使用代码显示加载动态库

  • 概述:
  • 示例代码:
  • dll.h
  • dll.cpp
  • 显示调用库代码示例:
  • 运行效果图:
  • over:
  • 文末一句话:


概述:

Qt创建共享库,也就是Windows平台上的动态链接库。动态链接项目编译后生成DLL文件,DLL文件在Windows平台上广泛使用。DLL文件使应用程序运行时加载的,不像静态库那样在编译期间就编译到程序中。若更新了DLL文件版本,只要接口未变,应用程序依然可以调用。(动态库如何创建可以参考前面的文章)

1. 首先说下一般用到库的情况:
(1)一般在开发过程中为了模块开发、功能分离开发和人员分工协作开发,会大量用到动态库(.dll)
(2) 一般会遇一些设计算发方面会用到调用动态库
2. 调用动态库一般为两种形式:
(1)隐式链接(implicit linking):前面创建动态库的文章分享了如何隐士链接动态库
(2)显示链接(explicit linking):今天文章像大家分享如何显示链接动态库
说明: 如果我们使用显示链接我们只需要一个.dll库文件即可;

示例代码:

dll.h

#ifndef FANTASTLIB_GLOBAL_H
#define FANTASTLIB_GLOBAL_H

#include <QtCore/qglobal.h>

#if defined(FANTASTLIB_LIBRARY)
#  define FANTASTLIBSHARED_EXPORT Q_DECL_EXPORT
#else
#  define FANTASTLIBSHARED_EXPORT Q_DECL_IMPORT
#endif

#endif // FANTASTLIB_GLOBAL_H
#ifndef FANTASTLIB_H
#define FANTASTLIB_H

#include "fantastlib_global.h"
class FANTASTLIBSHARED_EXPORT Fantastlib
{

public:
    Fantastlib();
    ~Fantastlib();
    /**
     * @brief testLib   测试动态库
     */
    void testLib();
};
extern "C" FANTASTLIBSHARED_EXPORT void test();					
extern "C" FANTASTLIBSHARED_EXPORT int add(int a,int b);
#endif // FANTASTLIB_H

dll.cpp

#include "fantastlib.h"
#include <QDebug>

Fantastlib::Fantastlib()
{
}

Fantastlib::~Fantastlib()
{

}

void Fantastlib::testLib()
{
    qDebug()<< "创建动态库成功!";
}


void test()
{
    qDebug()<< "test";
}


int add(int a, int b)
{
    return a+b;
}

说明:
1. 符号必须被导出为C函数。
2. 如果该库是由C++编译器编译的,那么该函数必须被包在extern "C"块中。
3. 并且在Windows平台上,还需要使用dllexport宏来修饰该函数。

显示调用库代码示例:

//显式调用动态库DLL
    QDir dirPtah;
    QString strPath = dirPtah.currentPath() + "/Fantastlib";        //1.当前动态库路径
    qDebug() << strPath;
    QLibrary libDLL("Fantastlib");                                  //2.找到动态库
    //QLibrary libDLL("Fantastlib"/*strPath*/);
    libDLL.load();                                                  //3.加载动态库
    qDebug() << libDLL.errorString();                               //4.打印动态库是否失败如果失败错误码是多少
    if(libDLL.isLoaded())                                           //5.如果动态库以加载到内存
    {
        typedef void (*funcDllVoid)(void);                          //6.定义将要调用的函数指针
        funcDllVoid testDll = (funcDllVoid)libDLL.resolve("test");  //7.把函数名传进去进行解析
        if(testDll)                                                 //8.若果成功调用此函数
        {
            testDll();
        }

        typedef int (*funcDllSub)(int,int);
        funcDllSub addDll = (funcDllSub)libDLL.resolve("add");
        qDebug() << libDLL.errorString();
        if(addDll)
        {
            qDebug() << addDll(5,5);
        }

    }
    libDLL.unload();                                                //9.卸载动态库

库文件位置

qt 加载lua qt加载库_qt

运行效果图:

qt 加载lua qt加载库_动态库_02