Qt Quick 用cmake怎么玩子项目
以下内容为本人的著作,如需要转载,请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s/o-_aGqreuQda-ZmKktvxwA
以往在公司开发众多的项目中,都会出现要求本项目里部分功能模块代码需要具备保密性。如果需要对外输出demo工程,那么需要做到不会泄密。
举一下爪子,以前做雷达开发的时候,客户从公司那儿买了这些雷达模块,也会需要从作为供应商的厂家这里拿到这些模块的开发demo(也就是示范软件工程)。但是由于demo里可能会用到一些涉及计算的内部算法函数调用,这些函数的实现属于公司商业机密是不能对外公开的,于是就提出了对部分代码保密的需求。
那么,怎么引入和管理这些需要保密的代码模块呢?一般的做法就是将需要保密的功能模块以子项目的形式引入到demo工程,这些子项目在编译时输出库文件,而demo工程则通过子项目提供的接口头文件引用这些库提供的接口。最后在打包输出demo工程之前,会把涉及保密功能模块所属的子项目源码从工程目录树中删除掉。被清理掉的子项目只留下生成的库文件和引用头文件(如果你的工程用的开发语言是C/C++)。
下面就继续用 Qt Quick 的开发示例来展开(果然。。。),这个示例里会实现一个简单的加法GUI小工具,计算过程所用到的算法以库API的形式提供,算法源码封装在库里。
本示例工程完整代码见文末链接分享!
设计工程目录
为了方便调用涉密的功能模块的接口以及打包输出不包含涉密模块源码的demo工程,接口的实现源码存放在对应模块的子工程(子项目)目录内,而接口的声明所在的头文件和涉密模块编译后输出的库文件需要存放在对应模块子项目的文件夹之外。之所以这样安排存放位置,是为了方便打包输出时对demo工程的清理。
看看我的工程目录:

这里有两个项目,一个顶层工程项目,也就是demo工程,命名为 gettingStartWithQtQuickSubProject,存放目录与工程名一致。另一个是子项目,里边代表着涉密模块的功能源码,命名为math。每个项目都对应一个CMakeLists.txt配置文件,其他文件视乎项目内容需要而定。
配置子项目
子项目 ./math/src/ 目录下存放着涉密模块的实现源码,这里只是简单地演示了加法的计算接口
/* inside file MyMath.cpp */
#include "MyMath.h"myMath::myMath(QObject *parent) : QObject(parent)
{}QVariant myMath::sum(QVariant a, QVariant b)
{return a.toInt() + b.toInt();
}
定义接口源文件
子项目math的所有源文件都存放在 ./math/src/ 目录下,所以将该目录指定为源文件搜索目录,并将搜索结果存到cmake自定义变量DIR_SRCS中,
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/src DIR_SRCS)
变量CMAKE_CURRENT_SOURCE_DIR是cmake自带变量,指向当前所属项目的配置文件所在目录,也即是 ./math/。
包含接口头文件
接口声明所在的头文件存放在demo项目的./src/include/中,在子项目中包含对应的目录需要通过demo项目的源码目录相对地指定。
include_directories(${CMAKE_SOURCE_DIR}/src/include)
变量CMAKE_SOURCE_DIR指向的内容就是顶层项目的配置文件(CMakeLists.txt)所在目录,这里的demo项目就是顶层项目。
配置输出库文件
子项目编译后输出的库文件应该自动输出到demo项目的./src/libs/中,可以通过设置cmake变量LIBRARY_OUTPUT_PATH来实现。
SET(LIBRARY_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/src/libs")
配置顶层项目(demo项目)
我们以demo项目为顶层项目,根据实际项目需要,本来是可以添加各式各样的子项目,但是这里根据示例需要仅添加math子项目。
添加子项目
本项目作为顶层项目,配置文件(CMakeLists.txt)中除了要描述清楚本项目的配置内容,还需要指明添加了哪些子项目,而且子项目需要在编译顶层项目之前被编译完成。
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/math)
如上,利用指令add_subdirectory添加了子项目math。此语句必须在add_executable语句之前。在完整工程编译链接后,打包输出demo工程时,需要手动删除此语句,因为客户在拿到demo工程后,不需要重新编译子项目的内容,而是直接使用库文件即可。
添加接口头文件
为了简化添加源文件和头文件的过程,采用递归目录搜索的方式,将指定目录下所有需要的文件检索到cmake自定义变量SRC_FILES中,方便后边的编译引用
file(GLOB_RECURSE SRC_FILES${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp${CMAKE_CURRENT_SOURCE_DIR}/src/*.h
)
接口头文件所在的目录./src/include也包含在上面的检索过程中了
添加链接库文件
指定链接目录以及链接的库math
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/src/libs)
link_libraries(math)
输出demo工程包
完整编译执行一遍demo工程后,库文件会被自动保存在demo工程目录下。编译过程中,各项目是分开按顺序编译链接的,先是子项目,然后才是顶层项目demo。
为了之后能单独编译链接demo项目内容,需要删除math目录,并且在demo工程的顶层CMakeLists.txt文件中,把添加子项目math的语句删除即可。
执行一下上面的工程

点击=执行

好了,简单演示到这里,欢迎后续交流…
本示例工程完整代码git仓库链接: git@github.com:ifi-leung/gettingStartWithQtQuickSubProject.git
相关文章:
Qt Quick 用cmake怎么玩子项目
以下内容为本人的著作,如需要转载,请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s/o-_aGqreuQda-ZmKktvxwA 以往在公司开发众多的项目中,都会出现要求本项目里部分功能模块代码需要具备保密性。如果需要对外输出demo工程&…...
大数据学习(29)-Spark Shuffle
&&大数据学习&& 🔥系列专栏: 👑哲学语录: 承认自己的无知,乃是开启智慧的大门 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一下博主哦ᾑ…...
archiver error. Connect internal only, until freed.
[64000][257] ORA-00257: archiver error. Connect internal only, until freed.原因 归档日志写满了、闪回日志写满了(根本原因是服务器磁盘写满了) # 切换到oracle服务 su - oracle# 使用sysdba用户登录 解决方案:(https://blog.csdn.net/qq_37635373/article/details/933282…...
鸿蒙HarmonyOS-图表应用
简介 随着移动应用的不断发展,数据可视化成为提高用户体验和数据交流的重要手段之一。在HarmonyOS应用开发中,一个强大而灵活的图表库是实现这一目标的关键。而MPChart就是这样一款图表库,它为开发者提供了丰富的功能和灵活性,使得…...
elasticsearch 笔记三:查询建议介绍、Suggester、自动完成
一、查询建议介绍 1. 查询建议是什么? 查询建议,为用户提供良好的使用体验。主要包括: 拼写检查; 自动建议查询词(自动补全) 拼写检查如图: 自动建议查询词(自动补全)…...
【hyperledger-fabric】将智能合约部署到通道
简介 本文主要来自于B站视频教学视频,也主要参看了官方文档中下图这一章节。针对自己开发的代码做出相应的总结。 1.启动网络 # 跳转到指定的目录 cd /root/fabric/fabric-samples/test-network# 启动docker容器并且创建通道 ./network.sh up createChannel2.打…...
nginx设置跨域访问
目录 一:前端请求 二:后端设置 网站架构前端使用jquery请求,后端使用nginxphp-fpm 一:前端请求 <script> $.getJSON(http://nngzh.youjoy.com/cc.php, { openid: sd, }, function(res) { alert(res); if(res.code 0) …...
Go语言学习第二天
Go语言数组详解 var 数组变量名 [元素数量]Type 数组变量名:数组声明及使用时的变量名。 元素数量:数组的元素数量,可以是一个表达式,但最终通过编译期计算的结果必须是整型数值,元素数量不能含有到运行时才能确认大小…...
阿里云OpenSearch-LLM智能问答故障的一天
上周五使用阿里云开放搜索问答版时,故障了一整天,可能这个服务使用的人比较少,没有什么消息爆出来,特此记录下这几天的阿里云处理过程,不免让人怀疑阿里云整体都外包出去了,反应迟钝,水平业余&a…...
城市分站优化系统源码:提升百度关键排名 附带完整的搭建教程
城市分站优化已成为企业网络营销的重要手段,今天来给大家分享一款城市分站优化系统源码。 以下是部分代码示例: 系统特色功能一览: 1.多城市分站管理:该系统支持多个城市分站的管理,用户可以根据业务需求,…...
【华为OD题库-107】编码能力提升计划-java
题目 为了提升软件编码能力,小王制定了刷题计划,他选了题库中的n道题,编号从0到n-1,并计划在m天内按照题目编号顺序刷完所有的题目(注意,小王不能用多天完成同一题) 在小王刷题计划中,小王需要用time[i]的时…...
使用pytorch进行图像预处理的常用方法的详细解释
一般来说,我们在使用pytorch进行图像分类任务时都会对训练集数据做必要的格式转换和增广处理,对测试集做格式处理。 以下是常用的数据集处理函数: data_transform { "train": transforms.Compose([transforms.RandomResizedCro…...
天线根据什么进行分类
天线是信息化时代的一个标准,广播信号塔,通信基站塔,卫星天线还有每天都要用到的手机,都是含有天线的,只是各种天线的作用不同,大小不同。今天给大家说一下,天线是如何分类的。 1.按工作性质可…...
JavaScript:正则表达式
JavaScript:正则表达式 什么是正则表达式正则表达式语法定义正则表达式判断是否有匹配的字符串查找匹配的字符串 正则表达式匹配法则元字符边界符量词字符类 什么是正则表达式 正则表达式用于匹配字符串中字符的组合模式。 正则表达式会依据其自身语法,…...
【Linux】深挖进程地址空间
> 作者简介:დ旧言~,目前大二,现在学习Java,c,c,Python等 > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:熟悉【Linux】进程地址空间 > 毒鸡汤ÿ…...
SVM(支持向量机)-机器学习
支持向量机(Support Vector Machine,SVM)是一种用于分类和回归分析的监督学习算法。它属于机器学习中的一类强大而灵活的模型,广泛应用于模式识别、图像分类、自然语言处理等领域。 基本原理: SVM的基本原理是通过找到能够有效分…...
解决生成的insert语句内有单引号的情况
背景 因为Mybatis-Plus的saveBatch()方法的批量插入其实也是循环插入,而不是真正的一个SqlSession完成的批插,效率很低。所以我们在写批量插入的时候是自己实现了一个工具类去生成批量插入的sql再去执行,但是会遇到有些文本里有单引号导致插…...
【Linux 程序】1. 程序构建
文章目录 【 1. 配置 】【 2. 编译 】makefile编写的要点makefile中的全局自变量CMake编译依赖的库g编译 【 3. 安装 】 一般源代码提供的程序安装需要通过配置、编译、安装三个步骤; 配置。检查当前环境是否满足要安装软件的依赖关系,以及设置程序安装所…...
GLTF 编辑器实现逼真3D动物毛发效果
在线工具推荐: 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 要实现逼真的3D动物毛发效果,可以采用以下技术和方法&…...
【Go语言入门:Go语言的方法,函数,接口】
文章目录 4.Go语言的方法,函数,接口4.1. 方法4.1.1. 指针接受者4.1.2. 值接收者和指针接收者有什么区别?4.1.3. 方法 4.2. 接口4.2.1. 接口定义 4.3. 函数4.3.1. 函数介绍 4.Go语言的方法,函数,接口 4.1. 方法 4.1.1…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...
从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
AD学习(3)
1 PCB封装元素组成及简单的PCB封装创建 封装的组成部分: (1)PCB焊盘:表层的铜 ,top层的铜 (2)管脚序号:用来关联原理图中的管脚的序号,原理图的序号需要和PCB封装一一…...
