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.卸载动态库
库文件位置
运行效果图: