Windows与Linux平台Qt中动态库(共享库)的动态加载

来源:互联网 发布:java定时器 编辑:程序博客网 时间:2024/05/16 01:52

Qt中加载动态库(共享库)的方法还是比较简单的,并且两个平台中的加载方法类似,就是需要的函数不太一样,下面通过一个例子简单介绍一下。

1.windows平台:

1.1 将制作好的库文件(XXX.dll)保存指定的位置,并在.pro文件中指出库的位置(可以使用绝对路径获相对路径),例如:

#LIBS += -LE:\KingIOBoxFuChao\MyIOBoxCodes\0826\DyLoadDll\DriLib
LIBS += -L..\DyLoadDll\DriLib

1.2 在代码是直接使用Windows下那套加载动态库的函数,实现动态库的加载

//windows中动态库的加载
//1.将Dll文件拷到指定目录下,并在.pro文件中指明Dll文件所在的路径
//LIBS += -LE:\KingIOBoxFuChao\MyIOBoxCodes\0826\DyLoadDll\DriLib
//2.加载库时只需要使用库的名称就可以完成加载。
#include <QCoreApplication>
#include <windows.h>
#include <iostream>
//#include <QLibrary>
//#include <QDebug>
using namespace std;
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    typedef int(*FUN2)(int, int);//定义函数指针类型
     HINSTANCE hInst,hInst1;
     hInst=LoadLibraryA("CreateDll.dll");//动态加载Dll
     //这句太重要了,搞了一整天才找出问题,我的天那!!!!
     if(NULL==hInst)
     {
         FreeLibrary(hInst);
         cout<<"LoadLibrary() error!"<<endl;
     }
     hInst1=LoadLibraryA("QtCreateDll.dll");//动态加载Dll
     //这句太重要了,搞了一整天才找出问题,我的天那!!!!
     if(NULL==hInst1)
     {
         FreeLibrary(hInst1);
         cout<<"LoadLibrary() error!"<<endl;
     }
     FUN2 Add=(FUN2)GetProcAddress(hInst,"_ZN9CreateDll3addEii");//获取Dll的导出函数
     //_ZN11QtCreateDll3addEii
     FUN2 Add1=(FUN2)GetProcAddress(hInst1,"_ZN11QtCreateDll3addEii");//获取Dll的导出函数
     if(!Add)
     {
        cout<<"GetProcAddress() error!"<<endl;
     }
    cout<<"I come from CreateDll.dll :"<<Add(1,10)<<endl;
    if(!Add1)
    {
       cout<<"GetProcAddress() error!"<<endl;
    }
   cout<<"I come from QtCreateDll.dll :"<<Add1(11,100)<<endl;
    FreeLibrary(hInst);//释放Dll函数
    FreeLibrary(hInst1);//释放Dll函数
    return a.exec();
}


2.Linux平台

1.1 方法与Windows类似,在.pro文件中指明库文件所在的位置,例如:

#动态调用库中的函数需要添加-ldl
LIBS=-ldl
#LIBS += -L/home/rock/Desktop/KingIOBoxFuChao/MyIOBoxCodes/0818/DyLoadSoTest/Lib
LIBS += -L../DyLoadSoTest/Lib

不同的时,比起Windows需要多添加LIBS=-ldl,用于指明是动态加载。

1.2 在代码是直接使用Linux下那套加载动态库的函数,实现动态库的加载

#include <QCoreApplication>
//实现共享库文件的动态加载
#include <stdio.h>
#include <dlfcn.h>
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    //1.打开/加载共享库libadd.so,用dlopen函数
//        void* handle = dlopen("../DyLoadSoTest/Lib/libcreatso.so",RTLD_NOW);
    void* handle = dlopen("libcreatso.so",RTLD_NOW);
        //2.判断是否失败,若失败打印错误信息
        if(NULL == handle)
        {
            printf("dlopen: %s\n",dlerror());
            return -1; // 表示出错结束
        }
        //3.查找函数add_int的内存地址,用dlsym函数
        int (*p_add_int)(int, int);
        p_add_int = ( int(*)(int,int) )dlsym(handle,"_ZN7Creatso7add_intEii");
        //4.判断是否失败,若失败则打印错误信息
        if(NULL == p_add_int)
        {
            printf("dlsym: %s\n",dlerror());
            return -1;
        }
        //5.调用函数,计算30与50的和,并打印
        int res = p_add_int(30,50);
        printf("result of add() is :%d\n",res);
        //6.关闭/卸载共享库,使用dlclose函数
        res = dlclose(handle);
        //7.判断是否失败,若失败则打印错误信息
        if(0 != res)
        {
            printf("dlclose: %s\n",dlerror());
            return -1;
        }
    return a.exec();
}










阅读全文
0 0