qtcanpool 知 10:包管理雏形

news2024/12/27 8:28:59

文章目录

  • 前言
  • 痛点
  • 转机
  • 雏形
  • 实践
  • 后语

前言

曾听闻:C++/Qt 没有包管理器,开发起来太不方便。这是一个有过 node.js 开发经验的人对 Qt 的吐槽。
确实,像 python、golang、node.js 这些编程语言都有包管理器,给用户带来了极佳的开发体验。第三方组件触手可得,妈妈再也不用担心我该怎么编译了。

我曾经思考过这个问题,觉得给 Qt 增加包管理器不难,难的是谁来牵头做。比较适合做这个事的应该是 Qt 官方,官方制定标准,Qt 开发者的软件兼容这个标准即可。
PS:我没有思考该怎么做,不过,读者看完本文可能会有点启发。

痛点

作者在维护 qtcanpool 的时候,遇到了库的管理问题,还没有上升到包管理层面(背后的逻辑是相似的)。
举个例子:qtcanpool 的库管理是在 src/libs 目录下添加库目录,然后库目录中直接存放库管理文件和源码文件(源码文件不能进一步放在子 src 目录,不然会影响头文件包含),比如下图的 qcanpool。应用程序在使用库的头文件的时候,头文件需要包含库目录名作为前缀,比如:

#include "qcanpool/extensionbutton.h"

在这里插入图片描述

问题描述:如果作者想引入第三方库,该如何做呢?
问题分析:通常第三方库有自己的目录结构,比如 src、example、tests、doc 等子目录,显然这不符合 qtcanpool 当前的库管理方式,需要做额外的操作。

解决方案一:在 qtcanpool/src/libs 目录下创建第三方库的名称目录,然后将第三方库 src 目录下的内容拷贝过来,再增加相关的库管理文件(pro、pri 文件)。
思考一下:这个方案有哪些问题?

  • 拷贝?
    • 太麻烦了
  • 后续怎么升级呢?
    • 拷贝新的文件覆盖老的文件,修改库管理文件。——还是麻烦

解决方案二:利用 git 的 submodule 功能,在 qtcanpool/src/libs 下创建第三方库的名称目录(如:qads),然后将第三方库以 git 子模块的形式添加到该目录下(如:Qt-Advanced-Docking-System),最后添加相关库管理文件。参考连接:https://gitee.com/icanpool/qtcanpool/tree/2.2.1/src/libs/qads
在这里插入图片描述

思考一下:

  • 拷贝?
    • 拷贝是不可能拷贝的。相比方案一,库文件不需要再拷贝了(开心)
  • 后续怎么升级呢?
    • 更新 git 子模块即可,本质上只需要更新到第三方库的某个提交(开心)
  • 那么问题来了,第三方库的目录结构不符合 qtcanpool 的管理方式,该怎么使用呢?
    • 这就是个问题了,为此需要单独增加一个 qads-inc.pri 管理文件,配置第三方库的头文件路径,接着应用程序的工程中需要 include 这个 pri 文件,然后应用程序中直接包含第三方库的相关头文件(不需要添加库前缀 qads)。—— 这产生了头文件包含风格不统一问题

痛苦是一种常态,作者接受了方案二。

转机

作者先表态:qmake 用习惯了提好用的,cmake 一言难尽。
Qt6 弃用 qmake,全面转向 cmake,并且在 Qt7 中大概率不再支持 qmake。

网友关于 cmake 的感悟:cmake 基本用过的人都不会觉得它有多好,其它 make 系统,比 cmake 使用体验好的没有 cmake 功能多,功能多的没有 cmake 生态完善,总之全面超越 cmake 的还没有出现。

大势所趋,趋之若鹜,毋庸置疑,qtcanpool 也需要支持 cmake。

qtcanpool 的工程管理的思想是来自 qtcreator,那么 cmake 自然也要保持延续。

qtcanpool 的 cmake 框架在 qtcanpool/cmake 目录:

  • 定义一个库,使用方法:add_qtc_library(包含该方法调用的 CMakeLists.txt 文件的上级目录会自动作为头文件搜索路径)
  • 定义一个应用,使用方法:add_qtc_executable

用户可以参考 qcanpool 库和 fancydemo 应用,此处不再赘述。
再赘述一下:qtc 是 qtcreator 的缩写,也是 qtcanpool 的缩写,挺完美的!

雏形

啊,cmake 真香!
cmake 管理确实很方便,就是学习曲线有点陡峭!

qtcanpool 集成了 cmake 之后,定义一个库非常方便(通过 add_qtc_library)。而且 cmake 通过 add_subdirectory 也非常方便引入库。

qtcanpool 中应用程序使用库头文件是遵循包含库目录名称的,如:#include "qcanpool/fancywindow.h“

思考:这个目录名称有点像模块名,可类比于 python 的包名(比如:import qcanpool,from qcanpool import FancyWindow)。python 开发的第三方库通常源码会放在模块名目录下,如:src/qcanpool/*.py,qcanpool/*.py

基于上述思考,如果 Qt 开发的第三方库源码不放在 src 目录下,而是放在库名称的目录下,是不是就可以保证包含头文件的时候带有库名前缀呢?

实践

样例库:qxmaterial
仓库地址:https://gitee.com/icanpool/qtcanpool-qxmaterial
在这里插入图片描述
目录结构:

  • examples:存放使用库的示例应用
  • qxmaterial: 是库名称目录,存放源码文件
  • CMakeLists.txt:库的 cmake 配置文件
    cmake_minimum_required(VERSION 3.10)
    
    if (NOT QTCANPOOL_DIR)  
        include(config.cmake)
    endif()
    
    add_subdirectory(qxmaterial)
    
  • confg.cmake:该仓库作为独立仓库(非 qtcanpool 子仓库)时的工程配置文件,该文件需要依赖 qtcanpool/cmake 框架。

如何使用呢?

  • qtcanpool-qxmaterial 作为一个独立仓库时。可以独立将库向前演进,通过 examples 中的应用示例可以独立验证该库。有点小瑕疵,就是该仓库需要依赖 qtcanpool 中的 cmake 框架(依赖的目的是为了保证框架的唯一性),默认二者需要保证目录层级是同级关系(可以根据实际情况修改 config.cmake 中的 QTCANPOOL_DIR 路径),如:
    qtcanpool
    qtcanpool-qxmaterial
    
  • qtcanpool-qxmaterial 作为 qtcanpool 的子库时。利用 git 的 submodule 功能,在 qtcanpool/src/libs 下创建第三方库的名称目录(如:qxmaterial),然后将第三方库以 git 子模块的形式添加到该目录下(如:qtcanpool-qxmaterial,子模块路径可以更改,不一定要保持和仓库名称一致),并添加一个库管理文件 CMakeLists.txt。
    qtcanpool
        src
            libs
                qxmaterial
                    qtcanpool-qxmaterial
                    CMakeListst.txt
    

CMakeLists.txt 内容如下:

add_subdirectory(qtcanpool-qxmaterial)

背后的逻辑是:

  • add_subdirectory(qtcanpool-qxmaterial) 会包含 qtcanpool-qxmaterial 目录内的 CMakeLists.txt 文件,内容如下:
    在这里插入图片描述

  • 如果作为 qtcanpool 的子库(即子目录),qtcanpool 会在顶层 CMakeLists.txt 中定义 QTCANPOOL_DIR,那么就不会包含 config.cmake,add_subdirectory(qtcanpool-qxmaterial) 相当于进一步调用 add_subdirectory(qxmaterial)

  • add_subdirectory(qxmaterial) 会包含 qtcanpool-qxmaterial/qxmaterial 目录内的 CMakeListst.txt 文件,内容如下:
    在这里插入图片描述

  • qxmaterial 目录内的 CMakeLists.txt 文件中调用 add_qtc_library 添加库,根据规则,那么该 CMakeLists.txt 文件的上一级目录会作为头文件的搜索目录,即 qtcanpool/src/libs/qxmaterial/qtcanpool-qxmaterial 会作为头文件搜索路径,如下所示:

    qtcanpool
        src
            libs
                qxmaterial
                    qtcanpool-qxmaterial    -----> 作为头文件搜索路径
                        qxmaterial          -----> 应用程序如果包含 "qxmaterial/xxx.h" 头文件,将自动会匹配该目录内的对应头文件
                            CMakeLists.txt
                        CMakeLists.txt
                    CMakeListst.txt
    

后语

本文所述的包管理只适合 qtcanpool,读者们若有启发欢迎交流!

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

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

相关文章

ASP.NET Core 9.0 静态资产传递优化 (MapStaticAssets )

一、结论 💢先看结论吧, MapStaticAssets 在大多数情况下可以替换 UseStaticFiles,它已针对为应用在生成和发布时了解的资产提供服务进行了优化。 如果应用服务来自其他位置(如磁盘或嵌入资源)的资产,则应…

LeetCode 力扣 热题 100道(十五)搜索插入位置(C++)

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 代码如下所示: class Solution { public:int searchIns…

WPF+LibVLC开发播放器-音量控制和倍速控制

界面 界面上增加音量的控件和倍速控制控件 音量控制 主要也是一个Slider进度条控件来实现音量调节 我们这里设置默认的最大值为100,默认Value值也为100,默认声音开到最大 这里目前完全由前端控制音量调节,可以直接使用ValueChanged事件实…

Vue3技术开发,使用纯CSS3动手制作一个3D环绕的相册展示效果,支持传入任意图片.3D轮播相册的组件

主要讲述封装一个3D轮播相册的组件&#xff0c;效果图如下&#xff0c;仅仅传入一个图片的数组即可&#xff0c;效果如下&#xff1a; 使用Vue3技术开发&#xff0c;支持传入任意张数的图片。 使用方法 <template><Swiper :list"list" /> </templat…

python怎么将字母大写

Python中有三种将字母转换为大写的方法&#xff1a;upper()、capitalize()、title()。 下面通过实例给大家介绍具体用法&#xff1a; str "www.php.com" print(str.upper()) # 把所有字符中的小写字母转换成大写字母 print(str.lower()) # 把所有字…

将vscode上的项目提交到github上

1.windows终端中 创建github仓库 创建完成 提交代码 git init git config --global user.email "fuyulai2024163.com" git config --global user.name "Fuyulai-Hub" git add . git commit -m "first commit" git remote add origin https://g…

【期末JavaEE项目】springboot+vue3完成中国铁路12306网站的业务实现【原创】

&#x1f939;‍♀️潜意识Java&#xff1a;个人主页 &#x1f399;告诉你&#xff1a;Java是世界上最美好的语言 &#x1f48e;比较擅长的领域&#xff1a;前端开发 是的&#xff0c;我需要您的&#xff1a; &#x1f9e1;点赞❤️关注&#x1f499;收藏&#x1f49b; 是…

浅谈CI持续集成

1.什么是持续集成 持续集成&#xff08;Continuous Integration&#xff09;&#xff08;CI&#xff09;是一种软件开发实践&#xff0c;团队成员频繁地将他们的工作成果集成到一起(通常每人每天至少提交一次&#xff0c;这样每天就会有多次集成)&#xff0c;并且在每次提交后…

电子商务人工智能指南 1/6 - 搜索、广告和发现

介绍 81% 的零售业高管表示&#xff0c; AI 至少在其组织中发挥了中等至完全的作用。然而&#xff0c;78% 的受访零售业高管表示&#xff0c;很难跟上不断发展的 AI 格局。 近年来&#xff0c;电子商务团队加快了适应新客户偏好和创造卓越数字购物体验的需求。采用 AI 不再是一…

【Git教程 之 版本控制】

Git教程 之 版本控制 Git教程 之 版本控制版本控制版本控制类型单用户版本控制系统&#xff08;VCS&#xff09;单用户版本控制系统&#xff08;VCS&#xff09;特点常见的单用户版本控制系统&#xff08;VCS&#xff09; 集中式版本控制系统&#xff08;CVCS&#xff09;集中式…

.NET Framework修复工具

某些精简Windows系统或者第三方下载的改版Windows系统在安装.NET Framework的时候会出现类似下面的错误信息: 可以使用微软官方出的.NET Framework修复工具解决, 下载地址: 【免费】.NETFramework修复工具资源-CSDN文库 下载后运行即可修复系统里的.NET Framework

计算机毕业设计Python轨道交通客流预测分析可视化 智慧交通 机器学习 深度学习 人工智能 爬虫 交通大数据

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

从计算服务器角度看智算与算力

计算服务器于智算和算力领域的地位堪称中流砥柱。人工智能旨在赋予计算机人类智能的使命&#xff0c;对计算服务器提出了近乎苛刻的要求。 在智算层面&#xff0c;它是计算服务器通向高效能的核心动力。凭借 CPU 与 GPU、FPGA、ASIC 等构建的异构组合&#xff0c;计算服务器可…

Lighthouse(灯塔)—— Chrome 浏览器性能测试工具

1.认识 Lighthouse Lighthouse 是 Google 开发的一款开源性能测试工具&#xff0c;用于分析网页或 Web 应用的性能、可访问性、最佳实践、安全性以及 SEO 等关键指标。开发人员可以通过 Lighthouse 快速了解网页的性能瓶颈&#xff0c;并基于优化建议进行改进。 核心功能&…

Logistic Regression(逻辑回归)、Maximum Likelihood Estimatio(最大似然估计)

Logistic Regression&#xff08;逻辑回归&#xff09;、Maximum Likelihood Estimatio&#xff08;最大似然估计&#xff09; 逻辑回归&#xff08;Logistic Regression&#xff0c;LR&#xff09;逻辑回归的基本思想逻辑回归模型逻辑回归的目标最大似然估计优化方法 逻辑回归…

使用Hadoop MapReduce进行大规模数据爬取

Hadoop MapReduce概述 Hadoop MapReduce是一个编程模型&#xff0c;用于处理和生成大数据集。它由Map和Reduce两个主要阶段组成。Map阶段负责处理输入数据&#xff0c;并将结果输出为键值对&#xff1b;Reduce阶段则对Map阶段的输出进行汇总和合并&#xff0c;生成最终结果。 …

AI驱动的低代码平台:解密背后的算法与架构创新

引言 在如今的数字化浪潮中&#xff0c;企业对软件的需求正以前所未有的速度增长。传统的开发方式由于开发周期长、成本高&#xff0c;已逐渐无法满足市场的快速变化。而低代码平台的出现&#xff0c;使得开发者和业务人员能够以极简的方式快速构建应用。然而&#xff0c;随着企…

【Spring工具插件】lombok使用和EditStarter插件

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 引入 一&#xff1a;lombok介绍 1&#xff1a;引入依赖 2&#xff1a;使用 3&#xff1a;原理 4&…

释放超凡性能,打造鸿蒙原生游戏卓越体验

11月26日在华为Mate品牌盛典上&#xff0c;全新Mate70系列及多款全场景新品正式亮相。在游戏领域&#xff0c;HarmonyOS NEXT加持下游戏的性能得到充分释放。HarmonyOS SDK为开发者提供了软硬协同的系统级图形加速解决方案——Graphics Accelerate Kit&#xff08;图形加速服务…

Zynq(6)FATFS读写eMMC

文章目录 1.简介eMMc与FAT2.eMMC与FAT的关系3.添加xilinx库4.用 FATFS完成emmc的读写5.传送门 1.简介eMMc与FAT eMMC (embedded MultiMediaCard) 是一种嵌入式闪存存储解决方案&#xff0c;由NAND闪存和内置的控制器组成&#xff0c;NAND闪存存储数据&#xff0c;而控制器负责…