Qt--动态链接库的创建和使用
写在前面
在Qt的实际开发中,免不了使用和创建动态链接库,因此熟悉Qt中动态链接库的创建和使用对后续的库开发或使用是非常用必要的。
在之前的文章https://blog.csdn.net/SNAKEpc12138/article/details/126189926?spm=1001.2014.3001.5501中已经对导入导出的声明有过详细介绍了,通过Qt向导创建的动态库项目也会带上这些声明,因此这里不再赘述。
开发环境;
Qt:5.15.2
Qt Creator:10.0.2
动态链接库的创建
打开Qt Creator,创建项目 -> 选择 库 -> C++ Library

自定义项目名称和存放路径:

默认使用qmake构建:

库类型默认:

无需翻译文件:

选择构建套件,这里使用Qt 5.15.2 MSVC2019_64bit

最后的总览;

生成后可以看到向导自动生成了如下文件:

.pro文件内容如下;

qtdlltest.h头文件中定义了导出类信息,内容如下;

QtDllTest_global.h头文件主要通过上面.pro文件中定义的QTDLLTEST_LIBRARY宏,来区别导入和导出声明:

最后是导出类的实现:

编译运行可以在生成路径下生成了一个dll:

这里添加一个成员函数,以便后面使用:


重新生成,同样可以使用dumpbin工具查看导出信息:
如何配置使用VS提供的dumpbin工具可参考:https://blog.csdn.net/SNAKEpc12138/article/details/126109249?spm=1001.2014.3001.5501

虽然发生了名字改编,也不影响我们在Qt项目中使用,可参考:https://blog.csdn.net/SNAKEpc12138/article/details/126235303?spm=1001.2014.3001.5501
动态链接库的使用
在其他项目中使用Qt动态链接库,需用到以下文件:
①导入/导出声明全局文件。例上面的:QtDllTest_global.h,若未使用全局文件,则无需。
②导出声明头文件。例上面的:qtdlltest.h
③lib 和 dll。例生成目录下的:QtDllTest.lib 和 QtDllTest.dll
下面再创建一个新的项目来使用上面生成dll, 这里使用一个简单Qt控制台程序示例。
首先将需要的文件拷贝到使用项目的目录下,头文件和.lib文件可需防止.pro文件所在目录下(因为要在代码中引用),.dll文件放在生成目录下。
这里习惯将头文件放在.pro目录下的include文件夹中,将.lib文件放在.pro目录下的lib文件夹中:

将.dll文件放在项目的生成目录下,不知道项目的生成目录,可在Qt Creator左侧的项目界面中查看:


文件放置妥当后,即可开始使用动态链接库了,这里也可分为静态加载和动态加载两种方式。
静态加载
在使用项目的.pro文件中添加附加库目录和导入.lib :

补充:$$PWD为.pro文件所在目录。
在代码中使用:

注意:上面.pro文件中的LIBS += $$PWD/lib/QtDllTest,有的版本无需加上.lib后缀,而有些版本则需要加上.lib后缀。
当出现以下报错(**LNK1181: 无法打开输入文件: ***\库名称.obj)时,则需要加上.lib后缀:

动态加载
因为动态加载只能调用动态库的导出函数,而且必须是extern"C"的,调用不了类,因此这里需要重新在dll项目中添加一个全局函数:


重新生成后更新qtdlltest.h、QtDllTest.lib、QtDllTest.dll到使用项目中!
然后即可在使用项目中动态加载:
#include <QCoreApplication>
//#include "qtdlltest.h"#include <QLibrary>
#include <QDebug>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);// QtDllTest dll;
// dll.printFromDll();QLibrary lib("QtDllTest.dll");if (!lib.load()){qDebug() << "Failed to Load Library!";qDebug() << lib.errorString();return 0;}typedef void (*pFunc)();pFunc f = lib.resolve("globalPrint");if (f){f();}else{qDebug() << "Failed to get function!";}return a.exec();
}
输出如下:

总结
综上,简单介绍了Qt动态链接库的创建和使用,使用时也分别示例的静态加载和动态加载的区别。
需要注意的是:
①静态加载添加.lib文件时,因Qt版本不同,可能需要加上.lib后缀。
②动态加载时,只能加载extern"C"的全局函数,不能加载类,因此在Qt中,一般不会使用这种加载方式。
若想使用动态加载,且用到导出类时,Qt中提供了QPluginLoader插件类来实现,这个会在之后的文章中详细介绍。
相关文章:
Qt--动态链接库的创建和使用
写在前面 在Qt的实际开发中,免不了使用和创建动态链接库,因此熟悉Qt中动态链接库的创建和使用对后续的库开发或使用是非常用必要的。 在之前的文章https://blog.csdn.net/SNAKEpc12138/article/details/126189926?spm1001.2014.3001.5501中已经对导入…...
设计模式十二:享元模式(Flyweight Pattern)
当我们需要创建大量相似对象时,享元模式可以帮助我们节省内存空间和提高性能。该模式通过共享相同的数据来减少对象的数量。 在享元模式中,有两种类型的对象:享元(Flyweight)和非享元(Unshared Flyweight&a…...
【LeetCode】88. 合并两个有序数组 - 双指针
这里写自定义目录标题 2023-8-7 22:35:41 88. 合并两个有序数组 双指针 2023-8-7 22:35:41 class Solution {public void merge(int[] nums1, int m, int[] nums2, int n) {int last m n ;while(n > 0){if(m > 0 && nums2[n-1] > nums1[m-1]){nums1[las…...
HarmonyOS应用开发的新机遇与挑战
HarmonyOS 4已经于2023年8月4日在HDC2023大会上正式官宣。对广大HarmonyOS开发者而言,这次一次盛大的大会。截至目前,鸿蒙生态设备已达7亿台,HarmonyOS开发者人数超过220万。鸿蒙生态充满着新机遇,也必将带来新的挑战。 HarmonyO…...
Qt中qmake、构建、运行、清理的区别
Qt 中默认的执行顺序:qmake--- 编译 --- 运行。 一、qmake qmake: 根据之前项目指南创建的项目文件 .pro,并且运行 qmake [qmake xx.pro]生成调试 [build-ttt-***-Debug] 或者发布 [build-ttt-***-Release] 目录(这个是影子构建…...
【设计模式——学习笔记】23种设计模式——观察者模式Observer(原理讲解+应用场景介绍+案例介绍+Java代码实现)
文章目录 案例引入原始方案实现实现问题分析 介绍基础介绍登场角色 案例实现案例一类图实现分析 案例二类图实现 观察者模式在JDK源码的应用总结文章说明 案例引入 有一个天气预报项目,需求如下: 气象站可以将每天测量到的温度、湿度、气压等等以公告的…...
【奇葩瑞萨-004】RX系列单片机的GPIO初始化
RX系列单片机的GPIO初始化 与IO口相关的寄存器端口(PORT)寄存器端口功能控制(MPC)寄存器MPC.PmnFPS的设置过程MPC寄存器设置注意事项 端口Pmn的初始化不同端口模式下,PORT、MCP寄存器的配置顺序 感想:与STM…...
【Git】Git切换地址
如何切换git代码地址? 1、查看当前远程 url git remote -v执行命令后,可以看见当前有2个URL。 远程 URL 在一般情况下有两个,分别是 fetch 和 push。 fetch URL 是用于从远程仓库获取最新版本的数据。当您运行 git fetch 命令时…...
elementUI点击当前行更改当前行状态(数据更新DOM不更新问题解决)
<template slot-scope"{row,$index}" slot"menu"><el-button v-if"row.editable" type"text" size"small" click"changeStatus(row,$index)">编辑</el-button><el-button v-else type"…...
python爬取阿里巴巴商品页面数据api
以下是使用Python爬取商品页面的示例代码: import requests from bs4 import BeautifulSoup# 定义要爬取的商品链接 url https://www.alibaba.com/product-detail/High-Quality-Custom-Logo-Printing-Black_60802527914.html# 发送请求 response requests.get(ur…...
angular-mat-select 多选 实现按选择顺序排序
mat-select 正常情况下,多选后,已选项是按列表顺序进行排序,如果我想实现按照点击项目的顺序进行排序,我该如何做呢? [参考网址](Angular order of selected option in multiple mat-select - Stack Overflow) sortComparator是Angular Material中mat-select组件的一个属…...
爬虫010_列表高级_添加_append_extend_修改_查询_in_not int_删除_del_pop_remove---python工作笔记029
然后再来看列表操作 首先添加append方法 然后插入,坐标是要插入的下标,右边是插入的内容 看结果 1,2,3,4,5,6 然后这个extend,是逐个插入,放到后边 然后是修改,直接对下标赋值 看结果</...
微服务服务拆分和远程调用
一、服务架构比较 单体架构:简单方便,高度耦合,扩展性差,适合小型项目。例如:学生管理系统 分布式架构:松耦合,扩展性好,但架构复杂,难度大。适合大型互联网项目&#x…...
MySQL8.1源码安装与部署
官方文档 https://downloads.mysql.com/archives/community/https://dev.mysql.com/doc/refman/8.1/en/binary-installation.html官方文档源码安装步骤 # Preconfiguration setup $> groupadd mysql $> useradd -r -g mysql -s /bin/false mysql # Beginning of source-b…...
algebraic reconstruction technique(ART)
数值线性代数的Kaczmarz方法被Gordon,Bender,Herman引入至CT重建中,称为ART方法。 A x b Axb Axb A A A为 m n m\times n mn的稀疏矩阵。 A A A的元素 a i j a_{ij} aij表示像素 j j j对射线 i i i投影的贡献。 A A A的行向量 a i T a…...
oracle11g安装
oracle11g安装 安装环境 虚拟机版本:centos7.9 虚拟机ip:192.168.5.144 oracle版本:11g oracle安装包:p13390677_112040_Linux-x86-64_1of7.zip,p13390677_112040_Linux-x86-64_2of7.zip,p13390677_11204…...
网络防御(9)
.一、SSL工作过程是什么? SSL位于应用层和传输层之间,它能够为基于TCP等可靠连接的应用层协议提供安全性保证。SSL协议本身分为两层: 上层为SSL握手协议(SSL handshake protocol)、SSLpassword变化协议(S…...
Spring核心与设计思想
文章目录 Spring是什么?认识Spring IoC容器传统的开发图书管理系统设计可能导致的问题 使用IoC容器 Spring是什么? Spring是一个用于构建企业级应用程序的开源框架,它为Java开发者提供了一种简化和加速应用程序开发的方式。Spring框架提供了…...
【stream的使用】使用stream.filter过滤List对象
Stream初相识 概括讲,可以将Stream流操作分为3种类型: 创建Stream Stream中间处理 终止Steam 每个Stream管道操作类型都包含若干API方法,先列举下各个API方法的功能介绍。 开始管道 主要负责新建一个Stream流,或者基于现有的数组…...
Flink多流处理之connect拼接流
Flink中的拼接流connect的使用其实非常简单,就是leftStream.connect(rightStream)的方式,但是有一点我们需要清楚,使用connect后并不是将两个流给串联起来了,而是将左流和右流建立一个联系,作为一个大的流,并且这个大的流可以使用相同的逻辑处理leftStream和rightStream,也可以…...
OpenClaw配置优化:GLM-4.7-Flash模型响应速度提升
OpenClaw配置优化:GLM-4.7-Flash模型响应速度提升 1. 为什么需要优化GLM-4.7-Flash的响应速度 第一次用OpenClaw对接GLM-4.7-Flash模型时,我遇到了典型的"等待焦虑"——一个简单的文件整理任务竟然花了3分钟才返回结果。通过日志分析发现&am…...
DFPlayer Mini串口协议与嵌入式驱动开发实战
1. DFPlayer Mini 驱动库技术解析:面向嵌入式工程师的底层控制实践DFPlayer Mini 是 DFRobot 推出的一款高度集成、低成本、低功耗的串口控制 MP3 播放模块,广泛应用于智能语音播报、工业人机交互、教育机器人、IoT 音频终端等场景。其核心价值在于&…...
缺失的第一个正数(力扣100)
最朴素的想法就是从1开始查找,看看谁不在,时间复杂度为On但是需要把原数组变成集合,空间复杂度为On不符合题目的常数级空间开销我们要找的是“第一个缺失的正数”。如果数组长度是 $N$,那么这个答案一定落在 [1, N1] 这个区间里。…...
美团、腾讯、字节怎么选?3个真实案例告诉你答案
美团、腾讯、字节怎么选?3个真实案例告诉你答案 2026校招季,三个朋友的不同选择 大厂直通车-校招大礼包:入口入口 写在前面 2026届秋招结束了。 我的三个朋友小A、小B、小C都拿到了心仪的offer。有意思的是,他们分别选了字节、腾…...
无公网IP解决方案:OpenClaw+nanobot内网穿透配置
无公网IP解决方案:OpenClawnanobot内网穿透配置 1. 为什么需要内网穿透? 去年我在尝试将OpenClaw接入家庭NAS时遇到了一个典型问题:没有公网IP。这意味着我无法在外网直接访问部署在家里的nanobot服务。经过多次尝试,最终通过内…...
基于RAG的智能客服系统实战:从架构设计到生产环境优化
最近在做一个智能客服系统的升级项目,之前用规则引擎维护起来太痛苦了,纯用大模型又贵又不准。经过一番折腾,最终用RAG(检索增强生成)技术搞定了,效果提升非常明显。今天就来分享一下从架构设计到上线优化的…...
AI赋能安装流程:快马智能诊断工具,自动解决软件安装兼容性问题
在开发软件的过程中,安装环节往往是第一个拦路虎。特别是当遇到系统环境复杂、依赖库版本冲突、权限配置等问题时,传统的安装方式常常让人头疼不已。最近我在尝试开发一个智能安装问题诊断工具时,发现InsCode(快马)平台的AI辅助功能特别实用&…...
Llama-3.2V-11B-cot部署详解:自动修复视觉权重加载致命Bug全过程
Llama-3.2V-11B-cot部署详解:自动修复视觉权重加载致命Bug全过程 1. 项目概述 Llama-3.2V-11B-cot是基于Meta Llama-3.2V-11B-cot多模态大模型开发的高性能视觉推理工具,专为双卡RTX 4090环境深度优化。本工具通过自动修复视觉权重加载等核心Bug&#…...
OmenSuperHub:惠普游戏本性能控制终极指南 - 开源替代方案全面解析
OmenSuperHub:惠普游戏本性能控制终极指南 - 开源替代方案全面解析 【免费下载链接】OmenSuperHub 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 还在为惠普Omen Gaming Hub的臃肿体积和隐私担忧而烦恼吗?OmenSuperHub为你提供了一…...
3个高效学习技巧:如何用JiYuTrainer实现课堂学习体验优化
3个高效学习技巧:如何用JiYuTrainer实现课堂学习体验优化 【免费下载链接】JiYuTrainer 极域电子教室防控制软件, StudenMain.exe 破解 项目地址: https://gitcode.com/gh_mirrors/ji/JiYuTrainer 问题场景:当数字化教学遇上学习需求冲突 "…...
