|
QtCanpool 3.3.0
|
本页说明如何从源码构建 QtCanpool、如何选择组件、如何运行测试以及如何生成文档站点。
| 项目 | 要求 |
|---|---|
| Qt | **5.15 及以上**,主推 Qt 6.5 / 6.8 LTS |
| C++ | C++17(构建框架强制 CMAKE_CXX_STANDARD 17,且不允许编译器扩展) |
| CMake | 3.16 及以上 |
| 编译器 | MinGW(随 Qt 分发)、MSVC 2019+、GCC 9+、Apple Clang |
| Doxygen(可选) | 1.9 及以上,仅在构建文档站点时需要 |
| Graphviz(可选) | 提供 dot 后类继承图才会生成 |
CMAKE_PREFIX_PATH 是选用 Qt 的唯一入口,例如 C:/Qt/6.8.3/mingw_64。 也可以在 Qt Creator 中直接打开根目录的 CMakeLists.txt。
根目录的 CMakePresets.json 固化了常用配置,省掉一长串 -D:
每个预设都带有默认路径,且可以用**环境变量覆盖而无需改文件**:
| 环境变量 | 用于预设 | 默认值 |
|---|---|---|
QTCANPOOL_QT_PREFIX | qt6 / qt5 | C:/Qt/6.8.3/mingw_64 / C:/Qt/5.15.2/mingw81_64 |
QTCANPOOL_WASM_QT | wasm | C:/Qt/6.8.3/wasm_singlethread |
QTCANPOOL_HOST_QT | wasm | C:/Qt/6.8.3/mingw_64 |
QTCANPOOL_EMSDK | wasm | C:/emsdk |
预设里的默认路径是替作者本机准备的,并且都假设 Windows 布局。 在别的机器上设置对应环境变量即可,不必改动
CMakePresets.json。
开关均为 CMake 缓存变量,可在配置时通过 -D<名字>=ON|OFF 指定, 配置完成后用 cmake -S . -B build -LH 可以列出全部开关及当前取值。
| 开关 | 默认 | 说明 |
|---|---|---|
WITH_DEMOS | ON | 构建 demos/ 下的综合示例 |
WITH_TESTS | OFF | 构建 tests/ 下的单元测试并注册到 CTest |
WITH_DOCS | OFF | 生成 Doxygen 文档站点(需要 Doxygen) |
WITH_ONLINE_DOCS | OFF | 生成在线文档(qdoc 通道,遗留开关) |
BUILD_WITH_PCH | ON | 使用预编译头加速构建 |
WITH_SANITIZE | OFF | 打开检测器;种类由 SANITIZE_FLAGS 指定(例如 address,undefined) |
WITH_COVERAGE | OFF | 打开覆盖率插桩(仅 GCC / Clang),产物交给 lcov |
BUILD_LINK_WITH_QT | OFF | 作为 Qt Creator 的子项目构建时链接其 Qt |
SHOW_BUILD_DATE | OFF | 在关于对话框中显示构建日期 |
ENABLE_SVG_SUPPORT | 自动 | 检测到 Qt SVG 时自动打开 |
每个库都可以单独关闭,关闭后依赖它的上层库会一并跳过,因此可以只构建需要的部分:
| 开关 | 默认 | 说明 |
|---|---|---|
WITH_QXCORE | ON | 基础设施库(配置、日志) |
WITH_QXTHEME | ON | 主题引擎(需要 WITH_QXCORE) |
WITH_QCANPOOL | ON | legacy 核心库(已冻结) |
WITH_QXRIBBON | ON | Ribbon 界面组件 |
WITH_QXDOCK | ON | 可停靠窗口组件 |
WITH_QXWINDOW | ON | 无边框自定义窗口组件 |
WITH_QXAPP | ON | 应用框架(需要上面全部) |
同一份源码同时支持两个大版本。构建框架中的 cmake/FindQt5.cmake 是一个 **Qt 6 优先的包装层**: 它把 Qt5::X 目标别名到 Qt6::X,因此库内部始终写 Qt5::Core、Qt5::Widgets 这类依赖, 实际链接到哪个版本取决于 CMAKE_PREFIX_PATH。
需要注意的少数差异:
QApplication **之前**设置属性。 demos/qxapp/appshell/main.cpp 给出了一份可直接复用的模板。QAction / QActionGroup:Qt 6 位于 QtGui,Qt 5 位于 QtWidgets。 项目约定使用**不带模块前缀**的 #include <QAction>,两个版本都能解析。Q_DECLARE_METATYPE:Qt 5.15 下需要显式包含 <QtCore/QMetaType>。测试通过 add_qtc_test() 注册,它为每个测试处理好 rpath、AUTOMOC 与头文件搜索路径 (公共包含目录是 src/libs,所以测试可以直接 #include "qxribbon/xxx.h")。
在**没有交互桌面**的环境(CI、远程会话)中运行界面相关测试时,需要指定离屏平台:
单个测试可以只跑一个用例类:
覆盖率与检测器都是**全局**开关:它们作用于树里的每一个目标。只插桩一部分只会得到 一个"看起来很干净"的假象。两者都仅支持 GCC / Clang,在其它编译器上会给出告警并忽略。
**覆盖率目前不是门禁**(决策 K8):CI 会产出报告并作为构建产物上传,但不会因覆盖率 偏低而失败。等有了真实基线再谈阈值,避免为了凑数字去写无效测试。
CI 把质量检查拆成两个作业,因为「门禁」和「只报告」不该互相拖累:
| 作业 | 内容 | 是否阻塞 |
|---|---|---|
quality | 覆盖率(lcov 报告 → artifact)、ASan + UBSan 跑完整 ctest | **是**(覆盖率按 K8 不设阈值,只有测试失败才红) |
tidy | clang-tidy 静态分析 | **否**(continue-on-error,报告只进作业摘要与 artifact) |
tidy **单独一个作业**是有意的:它原来跟在覆盖率与消毒器之后,等于让「不阻塞」的分析挡在所有 结果的墙钟时间前面。拆出去以后它与前两者并行跑,而且**只 configure 不编译**——clang-tidy 只需要 compile_commands.json,不需要任何目标文件。
clang-tidy **只报告不阻塞**——它面对的是一棵从未被静态分析过的树,在既有告警被甄别完之前就设成门禁, 只会把人训练成忽略红灯。摘要(按 check 分组的计数 + 前 20 条)直接写进 GitHub 的作业摘要页, 完整日志仍作为 clang-tidy-log artifact 保留。
doc/ 目录本身是一个独立的 CMake 工程,只依赖 Doxygen 与可选的 Graphviz,**不需要 Qt**:
也可以作为主构建的一部分生成:
可用的文档相关缓存变量:
| 变量 | 说明 |
|---|---|
DOXYGEN_EXECUTABLE | 指定要使用的 Doxygen 可执行文件 |
DOXYGEN_PROJECT_NUMBER | 覆盖页面中显示的版本号(默认取 cmake/QtCanpoolBranding.cmake) |
DOXYGEN_OUTPUT_LANGUAGE | 站点界面语言,默认 Chinese |
DOXYGEN_WARN_AS_ERROR | 设为 YES 或 FAIL_ON_WARNINGS 可让告警直接导致构建失败 |
构建完成后,可执行文件位于构建目录的 bin/(Windows); 在其它平台上它们位于 libexec/qtproject/(与安装布局一致):
| 示例 | 目标 | 说明 |
|---|---|---|
ribbondemo | RibbonDemo | Ribbon 界面:页、分组、快捷工具栏、应用按钮 |
dockdemo | DockDemo | 可停靠窗口:中央区域、浮动、标签化、布局保存 |
appshell | AppShellDemo | 应用外壳:导航轨 + 页面栈 + 停靠区 + 主题 + 启动屏 + 布局持久化 |
examples/ 下另有 22 个更细粒度的控件示例,同样由 CMake 构建,可用 -DWITH_EXAMPLES=OFF 关掉(默认随构建一起编译,但不安装)。
头文件安装到 <prefix>/include/qtproject,库与可执行文件安装到 <prefix>/lib (可执行文件在 Windows 的 <prefix>/bin、其它平台的 <prefix>/libexec/qtproject)。
⚠️ **公开头文件与 CMake 包配置位于带
EXCLUDE_FROM_ALL的Devel组件**, 普通安装不会装出它们,必须再执行一次组件安装:cmake --install build --prefix <安装目录> --component Devel
安装完成后即导出 CMake 包配置,下游工程可以 find_package(QtCanpool) 后 直接链接 QtCanpool::qxcore / QtCanpool::qxtheme / QtCanpool::qxribbon / QtCanpool::qxdock / QtCanpool::qxwindow / QtCanpool::qxapp 这些目标:
仓库里的 projects/consume 是一个最小下游工程,CI 在 ubuntu-latest / Qt 6.8.1 上执行完整的 "安装 → `find_package` → 编译链接 → 运行" 往返,作为可消费性的门禁。 此外还提供 vcpkg / Conan 骨架 (未经 CI 验证,供社区贡献)。
生成一个新工程用 scripts/new-project,它会产出一个自包含的 CMake 工程 (QxAppShell 窗口 + 一个页面 + 图标资源 + .gitignore):
不要 --build 时只生成,并打印出随后要执行的配置/编译命令(与 --build 实际执行的是同一组命令)。 路径也可以预先用环境变量给出:QTCANPOOL_SDK、QTCANPOOL_QT_PREFIX;Windows 上 CMake 默认选择 Visual Studio 生成器,若未安装 MSVC 需用 -G Ninja(或 -G "MinGW Makefiles")显式指定生成器。
生成的工程只依赖**已安装的** SDK:find_package(QtCanpool REQUIRED) 加一条 QtCanpool::qxapp 链接,不引用本仓库源码。
不装 SDK 而想先看看写法,读 projects/template (CMake 版)。
**qmake 已在 4.0 移除**,全树不再有 .pro / .pri,CMake 是唯一的构建方式。
此前它在 3.0 被宣布为"冻结(只读)",但因为 CI 从未构建过 qmake,冻结无人守护—— qxapp 的 -lib.pri 漏了 8 个源文件,其中就包括 QxAppShell 本体, 用 qmake 编出来的库里根本没有主窗口类。既然这份"兼容"已经名存实亡, K13 决定在 4.0 将其删除,而不是继续留着一批会腐烂的文件。
**迁移**:qmake 工程请改走 CMake——安装 SDK 后
find_package(QtCanpool)再 链接QtCanpool::qxapp等目标即可,见projects/consume与projects/template。