# CppLabInQt **Repository Path**: junbujianwpl/CppLabInQt ## Basic Information - **Project Name**: CppLabInQt - **Description**: cpp lab in Qt. - **Primary Language**: C++ - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2017-09-14 - **Last Updated**: 2026-07-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # CppLab 个人 C++ 实验仓:Qt 练手 + Windows/mac 控制台 / 原生 API demo + C++20 语言特性,合在一个仓库里。 ## 目录 ```text . ├── CMakeLists.txt # 根工程:可选开关 ├── docs/ # 技术架构 / 设计说明 ├── qt/ # 原 CppLabInQt(Qt UI / 动静库) ├── console/ # 原 win-console-demo(Win32 / mac 控制台等) │ └── src/external_libs/ # git submodule(Sciter 等) ├── modern/ # C++20+ 语言特性沙盒(协程等) └── .vscode/ # launch.json / tasks.json ``` 技术文档入口见 [`docs/README.md`](docs/README.md)(含 taurus 调度器从 `main` 加载的流程图)。 ## 依赖 | 子树 | 需要 | |------|------| | `qt/` | Qt5 或 Qt6(见 `qt/qt_env.sample.cmake`) | | `console/` | Windows SDK;部分目标还要 Boost / ffmpeg / Sciter(submodule) | | `modern/` | C++20 编译器;内置 X52 **taurus** 有栈协程(Win Fiber / Linux ucontext) | | `ShmConsumer` | 额外依赖本机 `todesk_5` 源码路径(见 `console/shm_consumer/CMakeLists.txt`) | 首次 clone 后拉 submodule: ```bash git submodule update --init --recursive ``` Qt 本地路径:复制 `qt/qt_env.sample.cmake` → `qt/qt_env.cmake` 后按机器改路径(该文件已 gitignore)。当前示例指向 `D:/Qt/Qt5.12.0/5.12.0/msvc2017(_64)`。 clangd:VS 生成器不写 `compile_commands.json`,另配 Ninja 库: ```bash # 需在 x64 MSVC 环境(或跑 VS Code task: cmake: configure (clangd / ninja)) cmake --preset clangd ``` 仓库根有 `.clangd`,指向 `build-clangd/`。背景索引缓存落在 `build-clangd/.cache/clangd/index/`(随 `--background-index` 持久化;清掉 `build-clangd` 会整库重索引)。 ## 构建 根目录统一 out-of-source: ```bash cmake -S . -B build -DBUILD_QT_LAB=ON -DBUILD_CONSOLE_LAB=ON -DBUILD_MODERN_LAB=ON cmake --build build --config Debug ``` 只编一边: ```bash # 只要 Qt(不装 Win demo 依赖也能配) cmake -S . -B build -DBUILD_QT_LAB=ON -DBUILD_CONSOLE_LAB=OFF -DBUILD_MODERN_LAB=OFF # 只要 console(不装 Qt 也能配) cmake -S . -B build -DBUILD_QT_LAB=OFF -DBUILD_CONSOLE_LAB=ON -DBUILD_MODERN_LAB=OFF # 只要 C++20 语言 demo cmake -S . -B build -DBUILD_QT_LAB=OFF -DBUILD_CONSOLE_LAB=OFF -DBUILD_MODERN_LAB=ON ``` console 细开关: - `-DBUILD_CONSOLE_TASKBAR=ON/OFF`(默认 ON) - `-DBUILD_CONSOLE_SHM_CONSUMER=ON/OFF`(默认 OFF;开之前确保 Boost / ffmpeg / todesk 路径可用) ### 常用 target | Target | 位置 | 说明 | |--------|------|------| | `LabUI` | `qt/` | Qt Widgets + Quick 主界面 | | `UdpMsgQue` | `qt/` | UDP 消息队列小工具 | | `ConsoleApplication` | `console/` | Win / mac 主控制台入口 | | `D2DDemo` | `console/` | Direct2D 演示 | | `WaterMarkDemo` | `console/` | GDI+ 水印 | | `SetLnkAumi` | `console/` | 给 `.lnk` 写 AppUserModelID | | `screenshot` | `console/screenshot` | Sciter 截图 demo | | `ShmConsumer` | `console/shm_consumer` | 共享内存消费 / ffmpeg | | `TaskbarDemo` | `console/src/win/taskbar` | 任务栏 / 截图工具栏 | | `CoroutineBasics` | `modern/coroutines` | C++20 协程 + X52 taurus 有栈协程 demo | 示例: ```bash cmake --build build --config Debug --target WaterMarkDemo cmake --build build --config Debug --target LabUI cmake --build build --config Debug --target CoroutineBasics ``` 根 CMake 把运行时输出统一到 `build/bin/`(MSVC 多配置下为 `build/bin/Debug/`)。 ## VS Code / Cursor 仓库根打开本仓即可(不要再挂双 folder workspace)。 - **Tasks**:`cmake: configure (all|qt only|console only)`,以及按 target 的 `cmake: build ...` - **Launch**:各入口的 `*(cppvsdbg)`;另有 `lldb` / mac 配置 先跑一次 `cmake: configure (all)`,再 F5 选对应 launch。 ## Qt 备注 - `qt_add_library` 是 Qt 6.2+ 才有;当前写法兼顾 Qt5 - 设了系统 Qt 环境变量后,`windeployqt` 可能只跟环境变量走、忽略 cmake 里配的路径——本地用 `qt_env.cmake` 时注意别和全局 PATH 打架 - Debug 库路径里若仍有 hard-coded `Debug/`,按架构逐步改成生成器表达式 ## 水印 demo(console) ```bash cmake -S . -B build -DBUILD_QT_LAB=OFF -DBUILD_CONSOLE_LAB=ON cmake --build build --config Debug --target WaterMarkDemo ``` ## 协程 demo(modern) ```bash cmake -S . -B build -DBUILD_MODERN_LAB=ON cmake --build build --config Debug --target CoroutineBasics ./build/bin/Debug/CoroutineBasics # Windows: build\bin\Debug\CoroutineBasics.exe ``` 预期输出(main 与协程交替): ```text main:第一次恢复协程 协程:第一段执行 main:第二次恢复协程 协程:第二段执行 main:第三次恢复协程 协程:执行完毕 ``` `CoroutineBasics` 单一入口三部分: 1. Part1:C++20 手动 `resume` 2. Part2:C++20 多协程调度 + `DumpCallStack` 3. Part3:**taurus**(`modern/coroutines/taurus/`,自 X52 移植)— 交错 worker、深层 `h3d_co_yield`、假同步 bot 循环 F5 选 **CoroutineBasics**。后续扩展仍放同一入口即可。