【Qt QML】QLibrary加载共享库中的类

ops/2024/9/23 10:48:52/

QLibrary是一个用于加载动态链接库(或称为共享库)的类。它提供了一种独立于平台的方式来访问库中的功能。

在QLibrary中,可以通过构造函数或setFileName()方法设置要加载的库文件名。当加载库文件时,QLibrary会搜索所有平台特定的库位置,除非传入的文件名具有绝对路径。如果传入的文件名具有绝对路径,那么会首先尝试加载该目录。如果该文件找不到,QLibrary会使用不同的平台特定的文件前缀或后缀再次尝试。例如,在Unix和Mac平台上使用"lib"前缀,在Unix平台上使用".so"后缀,在Mac平台上使用".dylib",在Windows平台上使用".dll"。

使用QLibrary可以在程序运行时加载动态链接库,一个QLibrary的实例作用于一个单一的共享库上。QLibrary提供了一种平台无关的方式访问库中的函数。此外,通过调用load()函数加载链接库,使用isLoad()函数判断加载是否成功,使用resolve()与load()差不多,但是当如果load失败,将会尝试再次加载。当经过一次加载后,链接库将会存储到内存中直到应用程序退出。使用unload()函数解除,如果有多个QLibrary使用了同一个动态链接库unload()将返回false。

下面的例子用来演示如何运行时加载共享库中的类

一、创建一个共享库

1、打开Qt Creator,创建共享库,新建类TestPlugin
TestPlugin.h

#ifndef TESTPLUGIN_H
#define TESTPLUGIN_H#include "testPlugin_global.h"class TESTPLUGIN_EXPORT TestPlugin
{
public:virtual ~TestPlugin();virtual int TestAddFunc(int a, int b) = 0;
};class TESTPLUGIN_EXPORT TestPluginLib : public TestPlugin
{
public:virtual ~TestPluginLib();int TestAddFunc(int a, int b) override;
};extern "C"{
TESTPLUGIN_EXPORT void* createTestPlugin();
}#endif // TESTPLUGIN_H

TestPlugin.cpp

#include "testplugin.h"TestPlugin::~TestPlugin()
{}void *createTestPlugin()
{return new TestPluginLib();
}TestPluginLib::~TestPluginLib()
{}int TestPluginLib::TestAddFunc(int a, int b)
{return a+b;
}

2、导出宏定义

#ifndef TESTPLUGIN_GLOBAL_H
#define TESTPLUGIN_GLOBAL_H#include <QtCore/qglobal.h>#if defined(TESTPLUGIN_LIBRARY)
#define TESTPLUGIN_EXPORT Q_DECL_EXPORT
#else
#define TESTPLUGIN_EXPORT Q_DECL_IMPORT
#endif#endif // TESTPLUGIN_GLOBAL_H
二、新建动态库加载demo,加载方式如下:
	using pluginFunc = void*(*)();QLibrary lib("testPlugin");if(!lib.load()){qCritical() <<__FUNCTION__<<" load error!";return -1;}auto func = (pluginFunc)lib.resolve("createTestPlugin");TestPlugin* cppLibObj = static_cast<TestPlugin*>(func());if(!cppLibObj){qCritical() <<__FUNCTION__<<" cppLibObj is nullptr!";return -1;}qInfo() <<__FUNCTION__<< "cppLibObj->TestAddFunc(1, 2)="<< cppLibObj->TestAddFunc(1, 2);

注意这里需要包含纯虚类TestPlugin定义所在的头文件。

三、运行结果如下:

在这里插入图片描述


http://www.ppmy.cn/ops/29747.html

相关文章

llama-factory/peft微调千问1.5-7b-chat

目标 使用COIG-CQIA数据集和通用sft数据集对qwen1.5-7b-chat进行sft微调,使用公开dpo数据集进行dpo对齐。学习千问的长度外推方法。 一、训练配置 使用Lora方式, 将lora改为full即可使用全量微调。 具体的参数在 该框架将各个参数、训练配置都封装好了,直接使用脚本,将数…

【跟马少平老师学AI】-【神经网络是怎么实现的】(八)循环神经网络

一句话归纳&#xff1a; 1&#xff09;词向量与句子向量的循环神经网络&#xff1a; x(i)为词向量。h(i)为含前i个词信息的向量。h(t)为句向量。 2&#xff09;循环神经网络的局部。 每个子网络都是标准的全连接神经网络。 3&#xff09;对句向量增加全连接层和激活函数。 每个…

C# wpf 运行时替换方法实现mvvm自动触发刷新

文章目录 前言一、如何实现&#xff1f;1、反射获取属性2、定义替换方法3、交换属性的setter方法 二、完整代码1、接口2、项目 三、使用示例1、倒计时&#xff08;1&#xff09;、继承ViewModelBase&#xff08;2&#xff09;、定义属性&#xff08;3&#xff09;、属性赋值&am…

IC设计数据传输 如何能保障安全高效?

IC&#xff08;集成电路&#xff09;设计数据&#xff0c;对于IC设计企业来说&#xff0c;其重要性不言而喻。所以IC设计数据传输过程中&#xff0c;其安全性和效率&#xff0c;也需要有保障。 首先我们来看看IC设计数据为什么重要&#xff0c;其重要性体现在多个方面&#xff…

118. 杨辉三角

118. 杨辉三角 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2: 输入: numRows 1 输出: [[…

【how2j Vue部分】两种在Vue的Ajax框架——fetch axios

fetch.js 和 axios.js 都是 Vue 中比较常见的两种ajax框架 1. fetch.js 一般说来 Vue 不会直接使用原生的 Ajax 而是使用 ajax 框架。 而 fetch.js 就是眼下比较流行的一种 ajax 框架 1. 准备 json数据&#xff1a;var url "https://gitee.com/api/v5/users/liyangyf&…

堆排序以及TOP-K问题

片头 嗨&#xff01;小伙伴们&#xff0c;大家好&#xff01;今天我们来深入理解堆这种数据结构&#xff0c;分析一下堆排序以及TOP-K问题&#xff0c;准备好了吗&#xff1f;我要开始咯&#xff01; 一、堆排序 这里我们先假设要排成升序&#xff0c;也就是从左到右&#xf…

spring boot学习第十八篇:使用clickhouse

1、pom.xml文件内容如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://…