Linux+qt:创建动态库so,以及如何使用(详细步骤)
目录
1、根据安装Qt Creator的向导进行创建
2、开发动态库注意的一些细节
3、给动态库添加一个对外开放的接口文件
4、了解下Qt的 .pri文件(非常实用)
5、如何调用动态库.so
1、根据安装Qt Creator的向导进行创建
(1)选择“Library”->“C++ Library”

(2)编写上动态库名字;
(3)选择需要的编译方式:(本文选择的是:gcc编译的方式)

(4)选择动态库所需要的模块:
注意:其实这里不选,后面也可以在.pro文件里添加的。
(5)填写动态库的名字
(6)点击完成即可:

2、开发动态库注意的一些细节
QT -= gui // 添加需要的模块
TARGET = testDll // 生成动态库的名字
CONFIG += plugin // 如果不加,可能生成的动态库为:libtestDll.so.1.0.0
DESTDIR = ../bin/dll
LIBS += -L../bin/dll -lrt

3、给动态库添加一个对外开放的接口文件
例如:添加一个testApi的文件,想向外面暴露哪些接口,可以在这里表示
(1)头文件
#ifndef TESTAPI_H
#define TESTAPI_H#include <QString>
using namespace std;//定义宏
#if defined(__cplusplus)
#define D_EXTERN_C extern "C"
#else
#define D_EXTERN_C
#endif#define D_CALLTYPE
#define D_DECL_EXPORT __attribute__((visibility("default")))
#define D_DECL_IMPORT __attribute__((visibility("default")))//向外暴露2个接口
D_EXTERN_C QString D_CALLTYPE printfAppPath();D_EXTERN_C QString D_CALLTYPE printfCurrentPath();#endif // TESTAPI_H
(2)源文件
具体实现,可以在TestDll中进行功能的是实现。
#include "testapi.h"
#include "testdll.h"QString printfAppPath()
{return TestDll::getInstance()->printfAppPath();
}QString printfCurrentPath()
{return TestDll::getInstance()->printfCurrentPath();
}
4、了解下Qt的 .pri文件(非常实用)
(1).pri文件功能:把额外用到的一些自定义组件放在一个文件中,方便调用,使用的时候采用include引用即可。
(2)具体创建流程:
1)打开项目文件夹,在这里面新建一个文件夹(名为demo);

2)在demo文件夹下新建一个pri文件(名为demo)。(怎么新建?可以新建一个文本文件,然后重命名为demo.pri);

3)打开Qt Creator ,在你的项目的Pro文件中加入相关的 .pri文件
写完保存后,自动刷新,.pri文件会自动导入到你的工程下。
include(General/general.pri)
INCLUDEPATH += -I $$PWD/General

4)然后可以在demo文件中添加Headers,Sources,Resources等文件~,如此一来下次使用就直接引用这个demo文件的内容即可。
HEADERS += \
$$PWD/TimerManager.h \
$$PWD/Singleton.hSOURCES += \
$$PWD/TimerManager.cpp

5、如何调用动态库.so
(1)在调用的地方进行,动态库接口声明:
//动态库接口声明
typedef QString (*TYPE_printfAppPath)();
typedef QString (*TYPE_printfCurrentPath)();// 声明一个变量
TYPE_printfAppPath printfAppPath;
TYPE_printfCurrentPath printfCurrentPath;//加载动态库
bool loadLibrary(const QString& appPath);
(3)源文件:
实现加载动态库,以及如何使用这个接口。
bool loadLibrary(const QString& appPath)
{QLibrary *m_pLibTest;//按照实际动态库所在的目录QString strLibFile = appPath + "/dll/libtestDll.so";if (QFile::exists(strLibFile))m_pLibTest = new QLibrary(strLibFile);else {slotAppendText(strLibFile + " don't exists");return false;}if(!m_pLibTest->load()){QString strErrMsg = m_pLibTest->errorString();slotAppendText(strLibFile + " load failed: " + m_pLibTest->errorString());return false;}else{slotAppendText(strLibFile + " load success");}printfAppPath = reinterpret_cast<TYPE_printfAppPath>(m_pLibTest->resolve("printfAppPath"));printfCurrentPath = reinterpret_cast<TYPE_printfCurrentPath>(m_pLibTest->resolve("printfCurrentPath"));if(!printfAppPath){slotAppendText("printfAppPath not resolve");return false;}if(!printfCurrentPath){slotAppendText("printfCurrentPath not resolve");return false;}QString strAppPath = printfAppPath();QString strCurrentPath = printfCurrentPath();slotAppendText("strAppPath : " + strAppPath);slotAppendText("strCurrentPath : " + strCurrentPath);return true;}
相关文章:
Linux+qt:创建动态库so,以及如何使用(详细步骤)
目录 1、根据安装Qt Creator的向导进行创建 2、开发动态库注意的一些细节 3、给动态库添加一个对外开放的接口文件 4、了解下Qt的 .pri文件(非常实用) 5、如何调用动态库.so 1、根据安装Qt Creator的向导进行创建 (1)选择“…...
如何将Docker的构建时间减少40%
与许多公司类似,我们为产品中使用的所有组件构建docker映像。随着时间的推移,其中一些映像变得越来越大,我们的CI构建花费的时间也越来越长。我的目标是CI构建不超过5分钟——差不多是喝杯咖啡休息的理想时间。如果构建花费的时间超过这个时间…...
二分查找——经典题目合集
文章目录 🦜69. x 的平方根🌼题目🌻算法原理🌷代码实现 🐳35. 搜索插入位置🌼题目🌻算法原理🌷代码实现 🦭852. 山脉数组的峰顶索引🌼题目🌻算法原…...
在Jupyter Lab中使用多个环境,及魔法命令简介
一、Jupyter Lab使用conda虚拟环境 1、给虚拟环境添加 ipykernel 方法一: 创建环境时直接添加ipykernel 方法:conda create -n 【虚拟环境名称】python3.8 ipykernel实例如下: conda create -n tensorflow_cpu python3.8 ipykernel 方法二ÿ…...
知虾数据软件:电商人必备知虾数据软件,轻松掌握市场趋势
在当今数字化时代,数据已经成为了企业决策的重要依据。对于电商行业来说,数据更是至关重要。如果你想在电商领域中脱颖而出,那么你需要一款强大的数据分析工具来帮助你更好地了解市场、分析竞争对手、优化运营策略。而知虾数据软件就是这样一…...
c语言中*p1++和p1++有啥区别
在C语言中,*p1和p1是两个不同的表达式,有以下区别: *p1:这是一个后缀递增运算符的组合。首先,*p1会取出指针p1所指向的值,并且对p1进行递增操作。简而言之,这个表达式会先取出p1指向的值&#x…...
2
【任务 2】私有云服务运维[10 分] 【适用平台】私有云 【题目 1】OpenStack 开放镜像权限[0.5 分] 使 用 OpenStack 私 有 云 平 台 , 在 OpenStack 平台的 admin 项 目 中 使 用 cirros-0.3.4-x86_64-disk.img 镜像文件创建名为 glance-cirros 的镜像,通…...
SELinux零知识学习二十二、SELinux策略语言之类型强制(7)
接前一篇文章:SELinux零知识学习二十一、SELinux策略语言之类型强制(6) 二、SELinux策略语言之类型强制 3. 访问向量规则 AV规则就是按照对客体类别的访问许可指定具体含义的规则,SELinux策略语言目前支持四类AV规则:…...
cadence layout lvs时出现error
Error:Schematic export failed or was cancelled.Please consult the transcript in the viewer window. 解决办法同下: cadence layout lvs时出现error-CSDN博客...
python练习题(markdown中的60道题)
1.Demo01 摄氏温度转化为华氏温度 celsius float(input(输入摄氏温度:)) fahrenheit (9/5)*celsius 32 print(%0.1f 摄氏温度转为华氏温度为 %0.1f % (celsius, fahrenheit))结果: 2.Demo02 计算圆柱体的体积 h, r map(float, input().split())# …...
【JavaSE】-4-单层循环结构
回顾 运算符: 算术 --、逻辑 && & || |、比较 、三元 、赋值 int i 1; i; j i; //j2 i3 syso(--j"-----"i) //1 3 选择结构 if(){} if(){}else{} if(){}else if(){}else if(){}else{}//支持byte、short、int //支持char //支持枚举…...
12、人工智能、机器学习、深度学习的关系
很多年前听一个机器学习的公开课,在Q&A环节,一个同学问了老师一个问题“机器学习和深度学习是什么关系”? 老师先没回答,而是反问了在场的同学,结果问了2-3个,没有人可以回答的很到位,我当时也是初学一脸懵,会场准备的小礼品也没有拿到。 后来老师解释“机器学习和…...
webpack external 详解
作用:打包时将依赖独立出来,在运行时(runtime)再从外部获取这些扩展依赖,目的时解决打包文件过大的问题。 使用方法: 附上代码块 config.set(externals, {vue: Vue,vue-router: VueRouter,axios: axios,an…...
代码混淆不再愁:一篇掌握核心技巧
1. 概述 代码混淆是将计算机程序的代码转换成一种功能上等价,但是难以阅读和理解的形式。 对于软件开发者来说,代码混淆可以在一定程度上保护程序免被逆向。 对于逆向工程师来说,学习代码混淆可以帮助我们研究反混淆技术。 2. 常见混淆…...
华为云IoT与OpenHarmony深度协同,加速设备上鸿即上云【云驻共创】
本次专题论坛探讨了华为云IoT与Open Harmony的深度协同、边缘屏蔽硬件差异、实现智慧隧道全方位智能化管理,以及华为云与Open Harmony生态的合作。同时也介绍了华为云物联网卡平台、HTTP2协议以及华为物联网在交通领域的应用。 一.华为云IoT与Open Harm…...
深入浅出 Linux 中的 ARM IOMMU SMMU I
Linux 系统下的 SMMU 介绍 在计算机系统架构中,与传统的用于 CPU 访问内存的管理的 MMU 类似,IOMMU (Input Output Memory Management Unit) 将来自系统 I/O 设备的 DMA 请求传递到系统互连之前,它会先转换请求的地址,并对系统 I…...
关于sqlModel 实现查询表单入参空值和模糊匹配一次性查询
在处理表单提交后,后端 SQL 查询部分空值和部分模糊值时,可以使用 SQLModel 构建动态查询。你可以根据表单数据动态构建 SQL 查询,并且只添加那些非空的、有值的条件。 以下是一个示例,假设你有一个模型 Item: from …...
数据仓库架构之详解Kappa和Lambda
目录 一、前言 二、架构详解 1 Lambda 架构 1.1 Lambda 架构组成 1.2 Lambda 特点 1.3 Lambda 架构的优点 1.4 Lambda 架构的不足 2 Kappa 架构 2.1 Kappa 架构的核心组件 2.2 Kappa 架构优点 2.3 Kappa 架构的注意事项 三、区别对比 四、选择时考虑因素 一、前言 …...
Banana Pi BPI-R3 Mini 开源路由器,也能拍出艺术美感
香蕉派BPI-R3 Mini路由器板开发板采用联发科MT7986A(Filogic 830)四核ARM A53芯片设计,板载2G DDR 内存,8G eMMC和128MB SPI NAND存储,是一款非常高性能的开源路由器开发板,支持Wi-Fi6 2.4G/5G(MT7976C)&am…...
Django高级之-分页器
目录 一、引入 二、分页推导 三、数据总页面获取 四、内置方法之divmod 五、终极大法 六、自定义分页器使用 【1】后端 【2】前端 一、引入 针对上一小节批量插入的数据 我们在前端展示的时候发现一个很严重的问题一页展示了所有的数据,数据量太大…...
【深度解析】从 Chatbot 到 AI 数字队友:Claude 高阶能力、模型选型与 API 实战
摘要 本文基于 Claude 高阶使用方法,系统拆解 Memory、Projects、Artifacts、Code Execution、Computer Use 等能力,并结合 OpenAI 兼容 API 给出 Python 实战示例,帮助开发者构建更稳定、可复用的 AI 工作流。背景介绍:为什么很多…...
设计流程:从需求洞察到落地的高效路径与核心方法
在AI深度渗透与在线设计工具蓬勃发展的当下,设计的边界早已超越单纯的美学表达,转向依赖系统化流程来保障高效、精准的产出。若需求洞察失焦,后续创作极易偏离用户与业务的核心价值,导致大量返工甚至项目失败。探索从识别真实诉求…...
如何5分钟完成FF14国际服汉化:终极中文补丁指南
如何5分钟完成FF14国际服汉化:终极中文补丁指南 【免费下载链接】FFXIVChnTextPatch 项目地址: https://gitcode.com/gh_mirrors/ff/FFXIVChnTextPatch 还在为《最终幻想XIV》国际服的英文界面而烦恼吗?FFXIVChnTextPatch中文补丁工具是你的完美…...
HomeSpan实战:如何用Arduino IDE构建多功能智能家居配件
HomeSpan实战:如何用Arduino IDE构建多功能智能家居配件 【免费下载链接】HomeSpan HomeKit Library for the Arduino-ESP32 项目地址: https://gitcode.com/gh_mirrors/ho/HomeSpan HomeSpan是一款专为Arduino-ESP32设计的HomeKit库,它能帮助开发…...
从监控到洞察:构建实时数据关联分析与根因定位系统
1. 项目概述与核心价值最近在折腾一个挺有意思的开源项目,叫“Lokis Insight”。这个名字一听就很有北欧神话的味道,Loki是诡计与智慧之神,而“Insight”则是洞察力。所以,这个项目本质上是一个旨在提供深度洞察、分析和可视化能力…...
Dubbo通信异常(channel is closed)问题分析
一、问题概述 ### 1.1 报错信息 系统运行过程中,消费者服务(support-t1-web)调用Dubbo服务时出现通信异常,具体报错如下: org.apache.dubbo.remoting.RemotingException: message can not send, because channel is…...
在RK3588上跑ROS Noetic,Rviz和Gazebo报错别慌,试试这几行命令
在RK3588上跑ROS Noetic:Rviz和Gazebo报错终极排障指南 当你兴奋地在RK3588开发板上装好ROS Noetic,准备大展拳脚时,Rviz和Gazebo却突然给你泼了一盆冷水——黑屏、闪退或是满屏的错误提示。别急着怀疑人生,这其实是RK3588的Mali…...
GESP5级C++考试语法知识(十三、贪心算法习题:1、双向贪心 2、区间选择贪心)
🍬 第1题:糖果王国的公平分配(双向贪心)1、🌈 故事开场(1)在糖果王国里,有一排小朋友站队领棒棒糖 🍭:(2)每个小朋友都有一个“胃口值…...
终极解决方案:d3d8to9让Direct3D 8经典游戏在现代Windows完美重生
终极解决方案:d3d8to9让Direct3D 8经典游戏在现代Windows完美重生 【免费下载链接】d3d8to9 A D3D8 pseudo-driver which converts API calls and bytecode shaders to equivalent D3D9 ones. 项目地址: https://gitcode.com/gh_mirrors/d3/d3d8to9 你是否还…...
如何在老旧Android设备上实现流畅的电视直播播放体验
如何在老旧Android设备上实现流畅的电视直播播放体验 【免费下载链接】mytv-android 使用Android原生开发的电视直播软件 项目地址: https://gitcode.com/gh_mirrors/myt/mytv-android 如果你曾经在低配置的Android电视或机顶盒上尝试观看高清直播,可能会遇到…...
