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();
}
- Windows与Linux平台Qt中动态库(共享库)的动态加载
- Windows动态库与Linux共享对象
- Windows动态库与Linux共享对象
- linux共享库的动态加载
- linux共享库动态加载
- Linux共享库的动态加载(附测试案例)
- Windows与Linux动态库的两种加载方式
- Windows与Linux动态库的两种加载方式
- C++ windows,linux跨平台动态库加载整理
- windows C/C++移植linux(2) 加载动态共享库的不同
- Linux平台gcc和动态共享库的基础知识
- Linux平台gcc和动态共享库的基础知识
- Linux平台gcc和动态共享库的基础知识
- Linux平台gcc和动态共享库的基础知识
- Linux平台gcc和动态共享库的基础知识
- Linux平台gcc和动态共享库的基础知识
- Linux平台gcc和动态共享库的基础知识
- Linux平台gcc和动态共享库的基础知识
- java循环语句
- linux 下的 \r 转移字符
- 习题 7.5 写一个函数,使输入的一个字符串按反序存放,在主函数中输入和输出字符串。
- <meta http-equiv="refresh" content="0;url=../">解释
- PDF Expert For Mac v2.2.2免费版
- Windows与Linux平台Qt中动态库(共享库)的动态加载
- httpClient相关知识点--使用方法
- Java高并发 --- 专业术语之同步、异步、锁、阻塞
- jqgrid学习
- logback logback.xml常用配置详解(一)configuration and logger
- 【MySQL】:[1]Mac如何安装MySQL
- 手把手教你从零开始做一个好看的 APP
- Yii CGridView中分页取得当前的页数并跳转到对应页数
- Latex博士论文格式版本(在CASthesis基础上作修改)