C++ 项目约定:目录结构、依赖管理、构建与 Git

所谓「约定」= 一套项目结构规范 + 依赖管理规范:以后不管做什么项目,都按这个套路来,不用每次重新想。 适用背景:Windows(VS2022)只做 Boost + OpenCV,不做 Qt;Qt 开发放在 Linux(Ubuntu 虚拟机/服务器)。 文中 <OpenCV安装目录>、<Boost根目录>、<项目根目录> 为占位符,替换成本机实际目录即可。 一、总体原则 三句话: CMake 是唯一的构建系统,不碰 qmake、不碰手动 .vcxproj。 依赖一律走环境变量 + find_package,不在 CMakeLists.txt 里硬编码路径。 Windows 端 IDE 是 VS2022 + CMake 项目模式;Linux 端用 Qt Creator 或 VS Code。 二、目录结构约定(Windows 端) 每个项目固定长这样: <项目根目录>\<项目名>\ ├── CMakeLists.txt ├── CMakePresets.json ├── CMakeUserPresets.json # 本地预设(不提交 Git) ├── .gitignore ├── README.md ├── src\ # 源码 │ ├── main.cpp │ ├── core\ # Boost 业务逻辑 │ │ ├── Service.h │ │ └── Service.cpp │ └── vision\ # OpenCV 图像处理 │ ├── ImageProcessor.h │ └── ImageProcessor.cpp ├── include\ # 对外头文件(可选) ├── resources\ # 静态资源、图片(可选) ├── tests\ # 测试代码(可选) ├── third_party\ # 第三方源码(可选,一般不用) └── out\ # 构建输出(不提交 Git) └── build\ ├── debug\ └── release\ 关键点: ...

2026 年 10 月 13 日

CMake 工程模板:VS2022 + Boost(静态库)

这是一个可直接复制的 Boost 工程模板(VS2022 + CMake + Ninja)。模板的作用:新建 Boost 项目时不用每次从零配置——复制模板、改项目名、加源文件即可。整套约定是:CMake 为唯一构建系统、依赖走环境变量 + find_package、构建输出在 out/build/、不写死路径。 前置环境变量: BOOST_ROOT = <Boost根目录> Boost 是静态库(vc143 构建),不用加 PATH,运行时不需要 dll 一、目录结构 <项目根目录>\BoostTemplate\ ├── CMakeLists.txt ├── CMakePresets.json ├── .gitignore ├── src\ │ └── main.cpp └── out\ └── build\ 二、CMakeLists.txt(复制到项目根目录) cmake_minimum_required(VERSION 3.20) project(BoostTemplate LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # ---------- Boost ---------- # BOOST_ROOT 由 CMakePresets.json 从环境变量注入,这里不写路径 set(Boost_NO_SYSTEM_PATHS ON) # 只从 BOOST_ROOT 找,不扫系统路径 set(Boost_USE_STATIC_LIBS ON) # 用静态库(vc143 静态构建) set(Boost_USE_MULTITHREADED ON) # 多线程版本 find_package(Boost 1.81 REQUIRED COMPONENTS filesystem system thread) # ---------- 源文件 ---------- set(SOURCES src/main.cpp ) add_executable(${PROJECT_NAME} ${SOURCES}) target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src ) target_link_libraries(${PROJECT_NAME} PRIVATE Boost::filesystem Boost::system Boost::thread ) 三、CMakePresets.json(复制到项目根目录) { "version": 3, "configurePresets": [ { "name": "debug", "generator": "Ninja", "binaryDir": "${sourceDir}/out/build/${presetName}", "cacheVariables": { "CMAKE_BUILD_TYPE": "Debug", "BOOST_ROOT": "$env{BOOST_ROOT}", "Boost_NO_SYSTEM_PATHS": "ON", "Boost_USE_STATIC_LIBS": "ON", "Boost_USE_MULTITHREADED": "ON" } }, { "name": "release", "inherits": "debug", "cacheVariables": { "CMAKE_BUILD_TYPE": "Release" } } ], "buildPresets": [ { "name": "debug", "configurePreset": "debug" }, { "name": "release", "configurePreset": "release" } ] } 版本待核实:预设文件 "version": 3 与 CMakeLists.txt 里 cmake_minimum_required(VERSION 3.20) 的版本要求是否匹配(version 3 预设需较新的 CMake),首次配置前请确认本机 / VS2022 自带 CMake 的实际版本。 ...

2026 年 10 月 13 日

CMake 工程模板:VS2022 + OpenCV 4.10

这是一个可直接复制的 OpenCV 工程模板(VS2022 + CMake + Ninja)。模板的作用:新建 OpenCV 项目时不用每次手动加 include/lib 路径——复制模板、改项目名、加源文件即可。整套约定是:CMake 为唯一构建系统、依赖走环境变量 + find_package、构建输出在 out/build/、不写死路径。 前置环境变量: OpenCV_DIR = <OpenCV安装目录>\build\x64\vc16\lib PATH 追加:<OpenCV安装目录>\build\x64\vc16\bin 一、目录结构 <项目根目录>\OpenCVTemplate\ ├── CMakeLists.txt ├── CMakePresets.json ├── .gitignore ├── src\ │ └── main.cpp └── out\ └── build\ 二、CMakeLists.txt(复制到项目根目录) cmake_minimum_required(VERSION 3.20) project(OpenCVTemplate LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # ---------- OpenCV ---------- # OpenCV_DIR 由 CMakePresets.json 从环境变量注入,这里不写路径 find_package(OpenCV REQUIRED) # ---------- 源文件 ---------- set(SOURCES src/main.cpp ) add_executable(${PROJECT_NAME} ${SOURCES}) target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src ${OpenCV_INCLUDE_DIRS} ) target_link_libraries(${PROJECT_NAME} PRIVATE ${OpenCV_LIBS} ) 三、CMakePresets.json(复制到项目根目录) { "version": 3, "configurePresets": [ { "name": "debug", "generator": "Ninja", "binaryDir": "${sourceDir}/out/build/${presetName}", "cacheVariables": { "CMAKE_BUILD_TYPE": "Debug", "OpenCV_DIR": "$env{OpenCV_DIR}" } }, { "name": "release", "inherits": "debug", "cacheVariables": { "CMAKE_BUILD_TYPE": "Release" } } ], "buildPresets": [ { "name": "debug", "configurePreset": "debug" }, { "name": "release", "configurePreset": "release" } ] } 版本待核实:预设文件 "version": 3 与 CMakeLists.txt 里 cmake_minimum_required(VERSION 3.20) 的版本要求是否匹配(version 3 预设需较新的 CMake),首次配置前请确认本机 / VS2022 自带 CMake 的实际版本。 ...

2026 年 10 月 13 日

VS 向导 vs CMake 手建工程:一次取舍记录

新建 C++ 项目时,用 VS2022 项目向导,还是手建目录 + CMake?核心结论:向导是「快」,CMake 手建是「稳」;长期维护的 Boost + OpenCV 项目走 CMake 手建路线。 一、「完全不利用 VS 向导」指什么 VS 新建项目时,向导会自动生成: 目录结构 .vcxproj / .sln 一些默认代码 默认的编译配置 不用向导,就是自己手建目录、手写 CMakeLists.txt、用 VS 的「打开文件夹」模式加载。 二、CMake 手建的好处 # 好处 说明 1 结构清晰、可控 向导生成的项目,目录和配置是向导定的;手建时 src/、include/、resources/、tests/ 怎么分,自己说了算 2 跨平台 CMakeLists.txt 是跨平台的:同一个项目,Windows 用 MSVC,WSL 用 GCC,不用改任何东西;向导生成的 .vcxproj 只能在 VS 里用 3 依赖管理统一 Boost、OpenCV 全走 find_package,环境变量一配,所有项目通用;向导的项目要手动一个个加 include、lib 路径 4 不污染仓库 .vcxproj、.sln、.vs/、out/ 都是本地文件,不进 Git;CMake 项目只需提交 CMakeLists.txt 和源码,干净 5 和工业界一致 大多数 C++ 开源项目、跨平台项目都用 CMake;养成这个习惯,以后参与别人的项目、或自己发布项目,都顺 6 配置一次、项目复用 环境变量和 CMakeLists.txt 模板定好后,新建项目就是复制模板、改项目名、加源文件。增量配置,不是每次从零配 三、CMake 手建的代价 初期配置复杂。第一次要理解:CMakeLists.txt 的语法、find_package 怎么找库、环境变量怎么设、CMakePresets.json 的格式。这些概念对新手是门槛。 VS 集成不如原生项目「顺滑」。向导项目是 VS 原生支持,调试、IntelliSense 开箱即用;CMake 项目通过「打开文件夹」或「CMake 项目」模式支持,功能也全,但偶尔会遇到配置识别问题。 调试和 IDE 功能偶有摩擦。断点、监视窗口、调用栈这些都没问题;但某些 VS 特有的功能(比如某些项目属性页面),在 CMake 项目里没有对应入口。 学习曲线。要同时学 CMake、学 Boost/OpenCV 的 CMake 配置。一次性投入大,但长期收益高。 四、取舍小结 整体体验是:结构清晰,配置相对复杂;不过做项目时配置一次,后续只是增量配置。 ...

2026 年 10 月 13 日

VS2022 打开 CMake 项目的调试说明:断点与 launch.vs.json

手建的 CMake 项目在 VS2022「打开文件夹」模式下的打开方式、自动生成的配置、断点调试与 launch.vs.json。核心结论:CMake 项目的调试体验与向导项目基本一致,唯一多出的一步是手动选启动目标。 一、怎么用 VS 打开手建的 CMake 项目 步骤: VS2022 → 文件 → 打开 → 文件夹。 选项目根目录,比如 <项目根目录>\MyProject。 VS 自动识别 CMakeLists.txt,切换到 CMake 项目模式。 VS 会自动做的事: 读 CMakeLists.txt,配置 CMake。 在项目根目录生成 .vs/,存 VS 自己的状态。 在 out/build/ 下生成构建产物。 底部状态栏出现 配置选择器(Debug/Release),和 CMake 目标选择器。 和向导项目一样,VS 该自动生成的还是会生成。 二、VS 自动生成的配置有哪些 和向导项目时一样: .vs/:VS 的工作状态、索引、窗口布局。不提交 Git。 out/:CMake 构建产物。不提交 Git。 CMakeUserPresets.json:如果在 VS 里改过预设,它可能生成这个。不提交 Git。 这些不影响项目结构本身,只是 VS 的本地缓存,删了能重建。 三、断点怎么用 CMake 项目的断点和向导项目完全一样。 基本流程 在代码行号左边点一下,出现红点,就是断点。 按 F5 启动调试(不是 Ctrl+F5,Ctrl+F5 是不调试直接运行)。 程序运行到断点处停下,VS 自动切换到调试界面。 底部出现调试工具栏:继续、单步跳过、单步进入、跳出。 左侧或底部窗口:局部变量、监视、调用栈、断点列表。 常用快捷键 操作 快捷键 启动调试 F5 停止调试 Shift + F5 单步跳过(不进入函数) F10 单步进入(进入函数) F11 跳出当前函数 Shift + F11 继续运行 F5 切换断点 F9 条件断点 右键断点 → 条件 CMake 项目特有的注意点 1. 启动目标 ...

2026 年 10 月 13 日

Windows 上 Boost + OpenCV + CMake 的环境配置方案:只配两件事

从零配置的一套通用方案:环境变量 + CMakePresets.json。一次配好,所有项目通用。Windows 端只配 Boost + OpenCV,不配 Qt(Qt 开发放在 Linux 端)。 文中 <OpenCV安装目录>、<Boost根目录>、<项目根目录> 为占位符,替换成本机实际目录即可。 一、环境变量(系统变量) 在 Windows「系统属性 → 环境变量」里,系统变量新建: 变量名 值 作用 OpenCV_DIR <OpenCV安装目录>\build\x64\vc16\lib OpenCV 的 Config.cmake 所在目录 BOOST_ROOT <Boost根目录> Boost 根目录 PATH 追加(运行时找 dll): <OpenCV安装目录>\build\x64\vc16\bin Boost 不用加 PATH,静态库,运行时不需要 dll。 二、每个库的配置细节 OpenCV 关键文件(示例路径): <OpenCV安装目录>\build\x64\vc16\lib\OpenCVConfig.cmake <OpenCV安装目录>\build\x64\vc16\lib\opencv_world4100.lib <OpenCV安装目录>\build\x64\vc16\lib\opencv_world4100d.lib 变量: OpenCV_DIR = <OpenCV安装目录>\build\x64\vc16\lib CMake 里: find_package(OpenCV REQUIRED) target_include_directories(main PRIVATE ${OpenCV_INCLUDE_DIRS}) target_link_libraries(main PRIVATE ${OpenCV_LIBS}) Boost 关键文件(示例路径): <Boost根目录>\stage\lib\cmake\Boost-1.81.0\BoostConfig.cmake <Boost根目录>\stage\lib\libboost_filesystem-vc143-mt-x64-1_81.lib <Boost根目录>\stage\lib\libboost_filesystem-vc143-mt-gd-x64-1_81.lib 变量: BOOST_ROOT = <Boost根目录> CMake 里: set(Boost_NO_SYSTEM_PATHS ON) set(Boost_USE_STATIC_LIBS ON) set(Boost_USE_MULTITHREADED ON) find_package(Boost 1.81 REQUIRED COMPONENTS filesystem system thread) target_link_libraries(main PRIVATE Boost::filesystem Boost::system Boost::thread) 注意:Boost 大部分是 header-only,find_package 只对需要编译的库(filesystem、system、thread 等)起作用。header-only 的库直接 #include 就行,CMake 里不用 find_package。 ...

2026 年 10 月 13 日

C++ 后端学习路线:以云服务器为练兵场

目标:从零起步,拿一台 2C2G 的云服务器当主战场,系统学习 C++ 后端开发。 原则:基础 → 系统 → 网络 → 框架 → 工程化,渐进推进;每个阶段都在云服务器上产出可运行的作品。 总览 阶段 主题 周期 云服务器上的产出 0 Linux 基础与服务器上手 起步阶段,边用边补 workspace 工作目录、用户与权限体系 1 现代 C++ 核心 2-4 周 编译与工具链的熟练度 2 Linux 系统与网络编程 4-6 周 手写并发 HTTP 服务器 3 框架与中间件 6-8 周 Drogon + MySQL + Redis 的 REST API 4 工程化与云原生 持续 Docker 化部署 + CI/CD + 监控 时长按「每天 1-2 小时」估算,弹性理解;项目驱动,不以周数为硬指标。 阶段 0 不必一次啃完:进程管理、看日志、shell 脚本这些内容在后面每个阶段都会反复用到,随用随补即可。 阶段 0:Linux 基础与服务器上手 这一层要覆盖的内容: ...

2026 年 8 月 25 日