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.h

SOURCES += \
    $$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;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/149223.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为摄像头通过stm32叠加字符串

void sendtoHuawei(uint8_t *cameraIp,uint16_t cameraSrcPort,uint16_t cameraDstPort,uint8_t *userName,uint8_t *pwd,uint8_t lineNum,int camNo)//华为 { int flag = 1; int sock = -1,connected; uint8_t ret; int recv_data_len; memset(str1, 0, …

任务流之间的调度依赖

检查任务 import java.sql.SQLException; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit;/*** 每一个有依赖其他flow的flow&#xff0c;都要先进行依赖的检查* 这是一个切面*/ public…

使用Sqoop命令从Oracle同步数据到Hive,修复数据乱码 %0A的问题

一、创建一张Hive测试表 create table test_oracle_hive(id_code string,phone_code string,status string,create_time string ) partitioned by(partition_date string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ,; 创建分区字段partition_date&#xff0c…

C语言基础篇4:变量、存储、库函数

1 局部变量和全局变量 在介绍局部变量和全局变量前&#xff0c;先了解一些关于作用域方面的内容。作用域的作用就是决定程序中的哪些语句是可用的&#xff0c;换句话说&#xff0c;就是程序中的可见性。作用域有局部作用域和全局作用域&#xff0c;那么局部变量就具有局部作用域…

应用软件安全编程--21避免使用不安全的哈希算法

在安全性要求较高的系统中&#xff0c;不可使用被业界公认不安全的哈希算法(如 MD2、MD4、MD5、SHA、 SHA1 等)来保证数据的完整性。 对于避免使用不安全的哈希算法的情况&#xff0c;示例1给出了不规范用法(Java 语言)示例。示例2给出 了规范用法(Java 语言)示例。 示例1:…

Docker部署MinIO对象存储服务器结合Cpolar实现远程访问

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 前言1. Docker 部署MinIO2. 本地访问MinIO3. Linux安装Cpolar4. 配置MinIO公网地址5. 远…

YB506AB是一款理电池充、放电管理专用芯片,集成锂电池充电管理和降压DC-DC电路。

YB506AB 锂电转可充电AA/AAA电池专用SOC芯片 概述: YB506AB是一款理电池充、放电管理专用芯片&#xff0c;集成锂电池充电管理和降压DC-DC电路。充电过程满足锂电池三段式滑流/恒流/恒压充电规范&#xff0c;B506内部的线性充电电路采用了恒流可配置模式&#xff0c;可以通过…

【shell】 1、bash语法超详细介绍

文章目录 修改前缀路径dirname set常用函数参数变量local 返回值正则打印第 n 行获取行号核对数据库各表数量jq查询检查日志 sshpassexpect数组xargs bash manual 修改前缀 参考 export PS1"bash> "路径 dirname strip last component from file name dir$(…

数据存储模型

1、前言 写点什么东西呢 之前大学毕设搞了个高并发模型&#xff0c;里面使用到了select模型&#xff0c;里面用到了一个内存池&#xff0c;支持多客户端连接、登录、消息发送&#xff0c;现在工作经验三年多了&#xff0c;开发经验积累了不少&#xff0c;但是对喜爱的C的一些知…

Nodejs--Express框架使用

目录 一.概念 二.项目目录结构 三.app.js 四.项目需要的中间件 五.Mysql连接 六.日志配置 七.实体模型配置 八.统一结果封装 九.app.js的详细配置 十.自定义登录拦截器 十一.route路由配置 十二.controller处理 十二&#xff1a;静态页面&#xff1a; 十三&#xff…

Pytest自动化测试框架:mark用法---测试用例分组执行

pytest中的mark&#xff1a; mark主要用于在测试用例/测试类中给用例打标记(只能使用已注册的标记名)&#xff0c;实现测试分组功能&#xff0c;并能和其它插件配合设置测试方法执行顺序等。 如下图&#xff0c;现在需要只执行红色部分的测试方法&#xff0c;其它方法不执行&am…

辅助笔记-Jupyter Notebook的安装和使用

辅助笔记-Jupyter Notebook的安装和使用 文章目录 辅助笔记-Jupyter Notebook的安装和使用1. 安装Anaconda2. conda更换清华源3. Jupter Notebooks 使用技巧 笔记主要参考B站视频“最易上手的Python环境配置——Jupyter Notebook使用精讲”。 Jupyter Notebook (此前被称为IPyt…

在Oracle 11g 数据库上设置透明数据加密(TDE)

本文回答2个问题&#xff1a; 11g下简明的TDE设置过程由于11g不支持在线TDE&#xff0c;介绍2中11g下的加密表空间的迁移方法 设置表空间TDE之前 表空间没有加密时&#xff0c;很容易探测到明文数据&#xff1a; create tablespace unsectbs datafile unsectbs.dbf size 10…

学习教授LLM逻辑推理11.19

学习教授LLM逻辑推理 摘要1 引言2前言2.1事件关系提取2.2 演绎推理 3 揭示逻辑推理中的LLMS3.1 LLM如何执行任务3.1.1数据源3.1.2实验装置3.1.3 分析 3.2 LLM如何执行抽象多跳推理&#xff1f;3.2.1数据来源3.2.2 实验装置。3.2.3 分析。 4 逻辑推理教学4.1 LLM的上下文学习4.2…

设置pdb自动启动

参考文档&#xff1a; How to Preserve Open Mode of PDBs When the CDB Restarts (Doc ID 1933511.1) -- 查看pdb的保留状态.无保留状态 select * from DBA_PDB_SAVED_STATES; SYScdbtest SQL> select * from DBA_PDB_SAVED_STATES;no rows selectedSYScdbtest SQL> -…

LeetCode 面试题 16.25. LRU 缓存

文章目录 一、题目二、C# 题解 一、题目 设计和构建一个“最近最少使用”缓存&#xff0c;该缓存会删除最近最少使用的项目。缓存应该从键映射到值(允许你插入和检索特定键对应的值)&#xff0c;并在初始化时指定最大容量。当缓存被填满时&#xff0c;它应该删除最近最少使用的…

音频录制实现 绘制频谱

思路 获取设备信息 获取录音的频谱数据 绘制频谱图 具体实现 封装 loadDevices.js /*** 是否支持录音*/ const recordingSupport () > {const scope navigator.mediaDevices || {};if (!scope.getUserMedia) {scope navigatorscope.getUserMedia || (scope.getUserM…

国外客户发开发信怎么发?写外贸邮件方法?

如何给国外客户发开发信&#xff1f;给老外发外贸开发信的技巧&#xff1f; 与国外客户保持联系并积极开展业务合作变得至关重要。一种有效的方式是通过发展信件&#xff0c;这可以帮助建立关系、传递信息和促成商机。蜂邮将介绍如何向国外客户发开发信&#xff0c;以确保您的…

python3:split()分割字符串为字符/字符串列表 2023-11-20

split() 方法通过指定分隔符对字符串进行切片&#xff0c;该方法将字符串分割成子字符串并返回一个由这些子字符串组成的列表。 #split("分隔符","分割次数") str_test"this is test" print (str_test.split()) # split()默认以空格为分…

2023大厂高频面试题之CSS篇(2)

系列文章: 2023前端大厂面试题之JavaScript篇(1) 2023前端大厂面试题之JavaScript篇(2) 2023前端大厂面试题之JavaScript篇(3) 2023前端大厂面试题之JavaScript篇(4) 2022大厂高频面试题之HTML篇 2023前端大厂高频面试题之CSS篇 2023前端大厂高频面试题之Vue篇(1) 2023前端大厂…