news 2026/9/16 11:16:13

cool-retro-term构建系统详解:.pro工程文件与Qt项目构建全流程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
cool-retro-term构建系统详解:.pro工程文件与Qt项目构建全流程

cool-retro-term构建系统详解:.pro工程文件与Qt项目构建全流程

【免费下载链接】cool-retro-termA good looking terminal emulator which mimics the old cathode display...项目地址: https://gitcode.com/GitHub_Trending/co/cool-retro-term

cool-retro-term 是一款模拟老式阴极射线管(CRT)显示效果的复古终端模拟器,基于Qt6 + QML + OpenGL 着色器实现。它采用经典的qmake .pro 工程文件组织构建,整条构建流程由根目录的 cool-retro-term.pro 统一编排。本文带你从零看懂这套构建系统:.pro 文件如何声明模块、如何编译着色器、如何安装产物,并给出完整的 qmake 构建命令。

1️⃣ 获取源码:克隆仓库并初始化子模块

项目依赖两个 Git 子模块,克隆后必须初始化,否则qmltermwidget目录会是空的:

git clone https://gitcode.com/GitHub_Trending/co/cool-retro-term cd cool-retro-term git submodule update --init --recursive

两个子模块分别承担不同职责(定义见 .gitmodules):

子模块作用
qmltermwidgetQML 版终端控件(Konsole qtermwidget 的移植),提供终端核心渲染
KDSingleApplicationKDAB 的单实例应用库,防止重复启动多开窗口

💡 仓库中 qmltermwidget/ 目录在浅克隆下是空的,属正常现象,--recursive参数会自动拉取内容。

2️⃣ 根工程文件:subdirs 多目录编排

顶层 cool-retro-term.pro 只有 11 行,却定义了构建的骨架:

TEMPLATE = subdirs CONFIG += ordered SUBDIRS += qmltermwidget SUBDIRS += app

三个关键指令:

  • TEMPLATE = subdirs:声明这是一个"子目录工程",qmake 会先展开所有.pro,再生成一个总 Makefile 统一调度;
  • CONFIG += ordered:保证按书写顺序串行构建——先编译qmltermwidget静态库,再编译app可执行程序(因为 app 链接依赖前者);
  • INSTALLS += desktop:安装时把 cool-retro-term.desktop 放入/usr/share/applications,让桌面环境能识别并显示应用条目。

这种"薄根工程 + 厚子工程"的结构是 Qt 多组件项目的标准做法,每个子目录各自维护自己的.pro,职责清晰。

3️⃣ 主程序工程:app/app.pro 逐段解读

app/app.pro 是整个构建系统的核心,可拆成 5 个功能区块。

3.1 Qt 模块与版本号自动注入

QT += qml quick widgets sql quickcontrols2 TARGET = cool-retro-term APP_VERSION = $$system(git -C $$PWD/.. describe --tags --always --dirty=-dirty) DEFINES += APP_VERSION=\\\"$$APP_VERSION\\\"
  • QT +=一行声明了全部依赖的 Qt 模块:quick/quickcontrols2(QML 界面)、sql(配置存储)、widgets(菜单等桌面组件);
  • $$system(...)在构建期调用git describe --tags,把最近的 Git Tag 编译进二进制,没有 Tag 时回退为unknown。运行时 app/main.cpp 通过APP_VERSION宏提供--version输出——版本号零维护,天然与代码仓库同步。

3.2 C++ 源码与单实例库

SOURCES += main.cpp \ fileio.cpp \ fontmanager.cpp \ fontlistmodel.cpp

应用层 C++ 代码很薄(界面全在 QML),只包含文件读写、字体管理等辅助类。同时通过 app/app.pro 将KDSingleApplication子模块的 2 个.cpp直接编入本目标,并用KDSINGLEAPPLICATION_STATIC_BUILD宏静态链接——避免额外安装一个动态库。

3.3 资源文件打包

RESOURCES += qml/resources.qrc

app/qml/resources.qrc 把 20+ 个 QML 组件、18 套复古字体(IBM 3278、Cozette、Atari 400 等)、噪点贴图以及全部编译好的着色器文件打进 Qt 资源系统。qrc文件在编译期生成 C++ 数组,资源随可执行文件分发,运行时不依赖文件路径。

3.4 着色器编译:Qt Shader Baker 定制编译器(最精彩的部分)

cool-retro-term 的 CRT 效果全靠 GPU 着色器。Qt 6 提供Qt Shader Baker(qsb)工具,把 GLSL 源码一次性编译为跨平台二进制格式(.qsb,支持 GLSL/HLSL/Metal)。app/app.pro 通过QMAKE_EXTRA_COMPILERS注册了自定义构建步骤:

qsb.commands = $$QSB_BIN --glsl "100 es,120,150" --hlsl 50 --msl 12 --qt6 \ -o ${QMAKE_FILE_OUT} ${QMAKE_FILE_IN}

更巧妙的是着色器变体批量生成(见 app/app.pro):两个"模板着色器"不参与普通编译,而是被 qmake 的四层for循环展开成带宏定义的独立编译任务:

  • 动态效果terminal_dynamic.fragraster 0~4 × burn 0/1 × frame 0/1 × chroma 0/140 个变体(对应屏幕扫描线强度、烧屏、外框、RGB 色散开关);
  • 静态效果terminal_static.fragrgb × bloom × curve × shine各 2 档 →16 个变体

每个变体通过-DCRT_RASTER_MODE=...等预定义宏生成专用二进制(如terminal_dynamic_raster2_burn1_frame1_chroma0.frag.qsb),运行时按设置选择已编译版本,避免了 GPU 端动态分支的性能开销——这就是你在 app/shaders/ 目录里看到几十个.qsb文件的来龙去脉。着色器入口 terminal_dynamic.frag 中的#ifndef默认值定义了各宏的缺省行为。

🎯 注释里还透露了未来计划:项目正在向 CMake 迁移,届时将改用 KDSingleApplication 自带的 CMakeLists.txt(见 app/app.pro 的 TODO 说明)。

3.5 安装规则

target.path += /usr/bin/ INSTALLS += target

加上 unix 分支的 32/64/128/256 四档 hicolor 图标(app/app.pro)与 macOS 的.icns图标,make install后即可得到系统级可用的完整应用。

4️⃣ 构建全流程:三条命令跑通

前置条件:已安装Qt6 开发包(含 qmake、qsb 工具)与 C++ 编译器(Ubuntu/Debian 下通常为qt6-base-devqt6-declarative-devqt6-svg-devqt6-base-dev-tools等)。

qmake cool-retro-term.pro # 1. 展开 subdirs,生成各子工程 Makefile make -j$(nproc) # 2. 按序构建:子模块静态库 → qsb 编译着色器 → 链接 app sudo make install # 3. 安装到 /usr/bin、图标目录与桌面条目

构建完成后,可执行文件会被输出到构建目录根部(DESTDIR = $$OUT_PWD/../,见 app/app.pro),直接运行./cool-retro-term即可启动;支持--default-settings-p <profile>--fullscreen等命令行参数(参数说明见 app/main.cpp)。

5️⃣ 构建之外:多格式打包体系

qmake 负责"从源码到二进制",而发行版打包则由 packaging/ 目录承担:

格式关键文件说明
Snapsnap/snapcraft.yaml使用qmake插件构建,声明 Qt/QML 全套 stage-packages
Debianpackaging/debian/rules标准的dh精简规则,配合 control 文件
RPMpackaging/rpm/cool-retro-term.spec面向 Fedora 等 RPM 发行版

也就是说,上游仓库只维护"构建 + 打包声明",各发行版官方仓库(Ubuntu、Fedora、Arch 等)会基于这些元数据生成对应的包,用户apt installdnf install即可直接使用,无需自己编译。

6️⃣ 小结:这套构建系统好在哪

  • 分层清晰:根工程只管编排(subdirs + ordered),子工程各自负责源码、资源与安装规则;
  • 自动化强:版本号来自 Git Tag、着色器变体由 qmake 循环展开生成,几乎零手工维护;
  • 跨平台完整:同一套.pro同时覆盖 Linux/macOS 构建与 Snap/Debian/RPM 三种发行格式;
  • 面向未来:已明确预留 CMake 迁移路径,qmake 配置可平滑过渡。

理解这份 app/app.pro,你就掌握了"Qt6 + QML + GPU 着色器"项目构建的完整范式,也为阅读、二次开发 cool-retro-term 打下了坚实基础。

【免费下载链接】cool-retro-termA good looking terminal emulator which mimics the old cathode display...项目地址: https://gitcode.com/GitHub_Trending/co/cool-retro-term

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/16 11:15:50

GB/T 26766-2019车载智能终端测试全攻略:从功能到可靠性

先说结论&#xff1a;如果你的车载智能终端准备进前装量产体系&#xff0c;或者要拿去交付出租车/营运车平台&#xff0c;GB/T 26766-2019的测试报告就是一道绕不开的门槛。尽管它是推荐性国标&#xff0c;但很多车厂的采购协议、行业监管平台都直接引用它做验收依据。我重点讲…

作者头像 李华
网站建设 2026/9/16 11:15:24

ADR4525BRZ-R7串联型电压基准源深度解析

1. 这颗芯片到底在解决什么问题&#xff1f;——从实验室烧板子说起你有没有遇到过这样的场景&#xff1a;调试一个高精度数据采集系统&#xff0c;示波器上看到ADC输出的码值总在3个LSB之间跳动&#xff0c;反复检查PCB布局、电源滤波、接地走线&#xff0c;甚至换了三款不同品…

作者头像 李华
网站建设 2026/9/16 11:14:05

YourIntegration

YourIntegration 【免费下载链接】recipes Application for managing recipes, planning meals, building shopping lists and much much more! 项目地址: https://gitcode.com/GitHub_Trending/re/recipes a little blurb about how it works or anything users should…

作者头像 李华
网站建设 2026/9/16 11:13:06

大众点评小程序mtgsig1.2签名机制解析与应用

1. 大众点评小程序mtgsig1.2技术解析大众点评作为国内领先的生活服务平台&#xff0c;其小程序采用了mtgsig1.2签名机制来保障接口通信安全。这个签名算法主要用于验证请求的合法性和防止未经授权的访问。在实际开发中&#xff0c;理解这个签名机制对于进行合法合规的接口调试和…

作者头像 李华
网站建设 2026/9/16 11:12:30

前端热搜深度解读:面试、部署、性能与AI工具链

今天早上打开热搜榜&#xff0c;前端相关词又占了一整排。2026前端面试题、前端八股文、内存泄漏怎么排查、Docker部署前端、微前端、前端AI……这些关键词单拎出来都眼熟&#xff0c;放在同一天里同时出现&#xff0c;其实就是当下前端开发者的真实生存图鉴&#xff1a;一部分…

作者头像 李华
网站建设 2026/9/16 11:12:00

功率三极管为何仍是工业可靠性的基石

1. 为什么今天还要聊功率三极管&#xff1f;——一个被低估的“老将”正在 quietly 承担着90%的工业底盘任务你打开任何一本电子技术入门教材&#xff0c;MOSFET那几页永远闪闪发亮&#xff1a;开关速度快、驱动简单、导通电阻低、热稳定性好……配上一张高频DC-DC变换器的漂亮…

作者头像 李华