QT 使用QLibrary加载动态库

2023-10-26

简介

    使用QLibraryi可以在程序运行时加载动态链接库。一个QLibrary的实例作用于一个单一的共享库上。QLibrary提
供了一种平台无关的方式访问库中的函数。可以在构建QLibrary的实例时将要加载的库文件传入,也可以在创建
实例后使用setFileName(0显式的设置要加载的文件名。当加载库文件时,QLibrary会搜索所有平台特定的库位
置,除非传入的文件名具有绝对路径。

    如果传入的文件名具有绝对路径,那么会首先尝试加载该目录。如果该文件找不到,QLibrary会使用不同的平台
特定的文件前缀或后缀再次尝试,比如Unix和Mac平台的"ib"前缀,Unix平台的".so"后缀,Mac平台
的".dyib",windows平台的".dll"。如果文件名不是绝对路径,QLibrary会修改搜索顺序,首先尝试系统特定的
前缀和后缀,紧接着是指定的文件路径。

    所以,基于QLibrary对库文件的搜索机制,我们推荐在传入库文件时只传入该库文件的基名,不写前缀或后缀。
这样一来,同一份代码可以在不同的操作系统上工作,并且该机制会保证进行最小次数的搜索。

    该类中最重要的函数是Ioad(),该函数动态的加载库文件,isLoaded()可以用来检查库文件是否成功加载,而resolve(函数则用来解析库中的符号地址,主要是函数地址。并且,resolve()函数在库文件未被加载时会隐式的尝试加载它。多个QLibrary实例可以可以访问同一个库文件。因为,库文件一旦被加载,就会驻留在内存中直到
应用程序终止。当然,我们可以使用unload()函数来尝试卸载一个库文件,但是如果有其他的QLibrary实例正在
引用同一个库文件,unload()会调用失败,并且该库文件会在所以实例都调用了unload()后才被卸载。

    QLibraryl库的典型用法是去解析一个库中的导出符号,并调用该符号表示的C函数。这被祢为“显式链接”,而
相对的“隐式链接”是在编译过程的链接阶段完成的。如下面的代码显示的那样,改代码先加载一个库,解析其
中的"ysymbol"符号,并在成功的情况下,调用该函数。如果由于某种原因出错了,例如库文件不存在或该符
号未被定义,那么相应的函数指针将被设为空,不会发生实际的调用:

QLibrary myLib("mylib");
typedef void (*MyPrototype)();
MyPrototype myFunction = (MyPrototype) myLib.resolve("mysymbol");
if (myFunction)
    myFunction();

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

出于方便,该类还提供了一个静态的resolv)函数,我们可以使用该函数来解析并调用一个库中的方法,而不需
要先加载该库。如下代码所示:

typedef void (*MyPrototype)();
MyPrototype myFunction =
        (MyPrototype) QLibrary::resolve("mylib", "mysymbol");
if (myFunction)
    myFunction();

其实,除了静态的resolve()函数,该类还提供了一个静态的isLibrary()函数,该函数可以根据特定平台来判断
一个文件是否是可被加载的库。其所使用的规则如下:
在这里插入图片描述
下面,我们通过一个实例来简单使用一下该类。

生成DLL库示例

我们先使用QtCreator来写一个d工程,工程名为Add,在该d川中提供一个函数,完成两个数字的加法。代码如
下:
在add.h中声明函数数,如下:

#ifndef ADD_H
#define ADD_H
 
#include "add_global.h"
 
extern "C" ADDSHARED_EXPORT int MyAdd(int a, int b);
 
#endif // ADD_H

在add.cpp中声明函数,如下:

#include "add.h"
 
int MyAdd(int a, int b)
{
    return a + b;
}

编译,生成DLL即可。

使用示例

我们接下来在建一个Qt控制台测试工程TestAdd。代码如下:

#include <QLibrary>
#include <QDebug>
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QLibrary lib("Add");
    if(!lib.load())
    {
        qDebug() << "load library failed";
	qDebug() << lib.errorString();
        return 0;
    }
    typedef int (*MyAdd)(int,int);
    MyAdd myAdd = (MyAdd)lib.resolve("MyAdd");
    if(myAdd)
    {
        qDebug() << "1 + 1 = " << myAdd(1, 1);
    }
    else
    {
        qDebug() << lib.errorString();
    }
    return a.exec();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT 使用QLibrary加载动态库 的相关文章

  • Control.FindForm 和 ContainerControl.ParentForm 有什么区别

    我想知道两者之间是否有任何功能 或其他 差异Control FindForm and ContainerControl ParentForm 我一直在使用 ParentForm创建我自己的用户控件时 但有什么原因吗 FindForm会是一个
  • 如何使用批处理文件将多个命令插入到批处理文件中

    我正在制作一个批处理文件 我们称之为 Create bat 它将创建一个批处理文件 我们称之为 Created bat 该文件将在其中插入多个命令 其中一条命令如下 FOR F x IN tasklist NH FI IMAGENAME e
  • 替换全局热键

    我有一个位于托盘中的应用程序 我想定义多个热键来触发我的程序中的事件 我从 AaronLS 在这个问题中的出色回答中找到了灵感 使用C 设置全局热键 https stackoverflow com a 27309185 3064934 如果
  • 使用 DEF 文件而不是 LIB 文件链接到 DLL?

    我了解到你可以 将 DLL 文件转换为 DEF文件 其中包括其导出 编辑 这不适用于许多约定 转换一个 DEF文件转换为 LIB 文件 您可以使用该文件链接到 DLL 为什么 大多数 链接器不能链接到给定的 DLLonly DEF 文件 而
  • Windows - 启动时自动启动特定应用程序

    在 Windows 操作系统中开发信息亭应用程序 当机器启动时 必须依次发生 3 件事 Node js 服务器启动 包含 Web 应用程序的浏览器以 kiosk 模式启动 另一个客户端应用程序启动 是否有一个实用程序可以轻松完成此操作 或者
  • 错误:命名空间“std”中没有名为“enable_if_t”的模板;您的意思是“enable_if”吗?

    我正在 macOS 10 13 6 上使用 Qt 5 11 3 进行编译 Qt使用的clang版本是 Applications Xcode app Contents Developer Toolchains XcodeDefault xct
  • Anaconda (Python) - Windows 10 上的 Cmder 集成

    我在 Windows 10 64 位上通过 Anaconda 让 Cmder 使用 Python 时遇到了一些麻烦 我让 Anaconda 工作得很好 测试过用 matplotlib 绘制一些东西 它与 Anaconda Prompt 一起
  • 如何获取打印机设备上下文?

    我在 Windows 上尝试使用以下命令打印增强型图元文件 EMF 播放增强元文件 http msdn microsoft com en us library dd162800 28VS 85 29 aspx 我当前正在使用屏幕上窗口的设备
  • 关于在 Qt 中使用未记录的类

    使用无证文件是否安全QObjectUserData类和QObject setUserData in Qt 相反 你可以看看使用QObject setProperty http doc qt io qt 5 qobject html setP
  • 从 Windows Batch (cmd.exe) 中的文件读取环境变量

    我正在尝试从批处理文件中读取变量 以便稍后在批处理脚本 Java 启动器 中使用 理想情况下 我希望所有平台 Unix Windows 上的设置文件都具有相同的格式 并且也是有效的 Java 属性文件 也就是说 它应该看起来像这样 sett
  • 从 C++ 源文件创建 Windows DLL

    我有多个 C 源文件 我想使用它们创建动态链接库 我在 linux 中使用 gcc shared 和 ln 看到这种情况发生 但是对于 Windows 我想我必须修改源文件才能生成 DLL 有没有办法用提供的源文件生成DLL 类似于linu
  • 如何搭建qtwayland?

    我花了一整天的时间尝试使用QtWayland Compositor 1 0在 Qt 创建者中 我已经遵循了从那里开始的所有步骤https wiki qt io QtWayland https wiki qt io QtWayland但我收到
  • 在 4K 屏幕上使用 Matplotlib 和 TKAgg 或 Qt5Agg 后端

    我在 Ubuntu 16 04 上使用 Matplotlib 2 0 和 Python 3 6 来创建数据图 电脑显示器的分辨率为 4k 分辨率为 3840x2160 绘图数字看起来非常小 字体也很小 我已经尝试过TKAgg and Qt5
  • 检查上次更改密码的时间[关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的
  • Python:获取Windows操作系统版本和架构

    首先 我不认为这个问题是重复的 在Python中检测64位操作系统 windows https stackoverflow com questions 2208828 detect 64bit os windows in python因为恕
  • 在 .NET 中使用 NTFS 压缩来压缩文件夹

    我想在 NET 中使用 NTFS 压缩来压缩文件夹 我发现这个帖子 http bytes com groups net c 262874 making folder compressed 但它不起作用 它抛出异常 无效参数 Director
  • Qt 5.5 QOpenGLWidget 链接错误未链接任何 openGL 调用

    我尝试使用 Qt 5 5 1 构建一个简单的 OpenGL 应用程序 一切都很好 直到我尝试使用 glClearColor 等 openGL 本机函数调用 该小部件实际上编译并产生黑屏 但在我尝试使用任何 openGL 本机函数后 它甚至不
  • 另一个宏中的 Q_PROPERTY 宏

    如何放置Q PROPERTY另一个宏里面 辅助宏 define SimpleAllinOne member type public void Set member type arg member m member arg member ty
  • 无法为 Windows 构建 OpenH264.lib

    我遵循了中提到的所有说明https github com cisco openh264 https github com cisco openh264但我无法通过 该信息在链接中引用 但相当混乱 替代方式 您可以在 Windows 中使用
  • 如何使用 winrar 提取与 zip 文件同名的文件夹中的所有 zip 文件?

    我需要迭代一个文件夹 对于每个 zip 文件 我需要使用它的名称来提取它 也就是说 如果它是 test zip 那么它应该解压到 test 文件夹 同样 它应该迭代我的文件夹及其子文件夹并提取内容 我编写了下面的代码 但它没有使用 zip

随机推荐

  • Qt中执行多条shell语句

    在Qt中执行一个shell指令常用QProcess类来完成 常见的用法示例如下 QProcess process process start find opt name ts calibrate str是需要执行的命令 flag proce
  • python之weditor定位的使用

    1 driver text 书城 定位元素的方式 属性定位 2 driver text 书城 click 点击元素 3 driver resourceId click 点击搜素按钮 4 driver resourceId send keys
  • 我在支付宝花了 1 分钟,查到了对象的开房记录

    来源丨Hack https mp weixin qq com s 6fDFqBQMqUVdkJG Dg7iCw 在大数据时代下 不管你做什么都会留下蛛丝马迹 只要学会把各种软件运用到极致 捉奸简直轻而易举 今天就来给大家分享一下 什么叫大数
  • Python基础学习:numbers模块

    numbers 数字抽象基类 其源代码存储在 Lib numbers py numbers模块定义了数字抽象基类的层次结构 逐渐定义更多的操作 该模块中定义的任何类型都不能实例化 1 数字塔 class numbers Complex 数字
  • Python EasyNote 1

    描述 Python strip 方法用于移除字符串头尾指定的字符 默认为空格或换行符 或字符序列 注意 该方法只能删除开头或是结尾的字符 不能删除中间部分的字符 Python split 通过指定分隔符对字符串进行切片 如果参数 num 有
  • 05 CoCos Creator-native.log

    1 Compile failed 编译保存信息 查看报错文件 C Users Administrator CocosCreator logs native log Error Compile failed The log file path
  • 宏和函数

    此为C语言的基础 和Linux内核关系并不大 不过还是作为补充知识点介绍一下好了 宏非常频繁的用于执行简单的计算 比如在两个表达式中寻找其中较大的一个 define MAX a b a gt b a b 如果使用函数来实现的话就比较慢 宏的
  • Hololens2发布流程记录,含MRTK2导入,工程的安装

    记录一下HoloLens2发布流程 1 创建新工程 我这边用的是unity2019版本 2 下载MixedRealityFeatureTool exe 官网链接 https download microsoft com download 2
  • 住宅IP和机房IP的特征区别

    住宅IP是ISP 互联网服务提供商 或ADSL提供商分配给单个用户的实际住宅IP地址 由100 真实WIFI网络用户组成 住宅IP是真正的用户设备IP 与主流用户的宽带网络IP完全一致 与机房等IP相比 成功率更高 关闭概率更低 但维护稳定
  • 在spring引入log4j

    在spring中使用log4j 引入log4j软件包 配置log4j属性 加载log4j配置文件 默认加载 手动加载 使用logger 本文的整体代码结构是在已经引入spring基本应用的前提下 在spring配置文件中通过 Bean注解创
  • git---查看当前账户和切换账户

    查看当前用户名和邮箱 git config user name git config user email 修改用户名和邮箱 git config global user name Your username git config glob
  • GPT-Tools Cookbook by Eric

    1 账号申请和登录 1 1 OpenAI 账号注册 可以参考 2 ChatGPT 的注册与登录 来自 涛哥ChatGPT和Python变现圈 选择账号邮箱 我们在尝试过直接使用邮箱注册OpenAI账号 试验了两次 都没有成功 Note 第二
  • SpringBoot 集成SpringBatch 批处理框架

    SpringBatch 核心组件简介 1 JobRepository 用来注册Job容器 设置数据库相关属性 2 JobLauncher 用来启动Job的接口 3 Job 我们要实际执行的任务 包含一个或多个 4 Step 即步骤 包括 I
  • 自然语言处理实战项目18-NLP模型训练中的Logits与损失函数的计算应用项目

    大家好 我是微学AI 今天给大家介绍一下 自然语言处理实战项目18 NLP模型训练中的Logits与损失函数的计算应用项目 在NLP模型训练中 Logits常用于计算损失函数并进行优化 损失函数的计算是用来衡量模型预测结果与真实标签之间的差
  • QQkey后门

    今天凌晨收到 LX2222 的举报反馈被盗号 发布的加速器盗取账号信息 https www 52pojie cn thread 785555 1 1 html 我们着手分析一下看看软件确实发现了问题 被添加了盗取QQkey的后门 通过拿到Q
  • SQL查询语句之查询数据

    目录 1 基本查询语句 2 单表查询 2 1 查询所有字段 1 列出表中的所有字段 2 使用 查询所有字段 2 2 查询指定字段 2 3 查询指定记录 2 4 带 in 关键字的查询 2 5 带 between and 的范围查询 2 6
  • HTML中Table表格的使用与漂亮的表格模板

    1 表格标记 表格是网页中十分重要的组成元素 表格用来存储数据 包含标题 表头 行和单元格 在HTML语言中 表格标记使用符号 table 表示 定义表格光使用 table 是不够的 还需要定义表格中的行 列 标题等内容 标记 说明 表格标
  • Vue2 项目里,使用 Element 的 dialog 里嵌套 tabs,导致关闭 dialog 时浏览器卡死问题

    Vue2 项目里 使用 Element 的 dialog 里嵌套 tabs 导致关闭 dialog 时浏览器卡死问题 解决办法 给 tab 添加 v if 绑定 dialog 的 visible sync
  • 如何查看awr/statspack报表,来定位系统的问题

    author skate time 2010 03 25 如何查看awr statspack报表 来定位系统的问题 数据库的性能指标一般都有什么 只有定好指标才能判定系统的性能 性能参考指标一般有如下几个 1 响应时间 平均每事务的响应时间
  • QT 使用QLibrary加载动态库

    简介 使用QLibraryi可以在程序运行时加载动态链接库 一个QLibrary的实例作用于一个单一的共享库上 QLibrary提 供了一种平台无关的方式访问库中的函数 可以在构建QLibrary的实例时将要加载的库文件传入 也可以在创建