<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>工具链 on 鹿鸣青野的blog</title><link>https://www.sylgalaxy.xyz/categories/%E5%B7%A5%E5%85%B7%E9%93%BE/</link><description>Recent content in 工具链 on 鹿鸣青野的blog</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Tue, 13 Oct 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://www.sylgalaxy.xyz/categories/%E5%B7%A5%E5%85%B7%E9%93%BE/index.xml" rel="self" type="application/rss+xml"/><item><title>C++ 项目约定：目录结构、依赖管理、构建与 Git</title><link>https://www.sylgalaxy.xyz/posts/env-project-convention/</link><pubDate>Tue, 13 Oct 2026 00:00:00 +0000</pubDate><guid>https://www.sylgalaxy.xyz/posts/env-project-convention/</guid><description>&lt;p&gt;所谓「约定」= 一套&lt;strong&gt;项目结构规范 + 依赖管理规范&lt;/strong&gt;：以后不管做什么项目，都按这个套路来，不用每次重新想。&lt;/p&gt;
&lt;p&gt;适用背景：&lt;strong&gt;Windows（VS2022）只做 Boost + OpenCV，不做 Qt；Qt 开发放在 Linux（Ubuntu 虚拟机/服务器）&lt;/strong&gt;。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;文中 &lt;code&gt;&amp;lt;OpenCV安装目录&amp;gt;&lt;/code&gt;、&lt;code&gt;&amp;lt;Boost根目录&amp;gt;&lt;/code&gt;、&lt;code&gt;&amp;lt;项目根目录&amp;gt;&lt;/code&gt; 为占位符，替换成本机实际目录即可。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="一总体原则"&gt;一、总体原则&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;三句话：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;CMake 是唯一的构建系统&lt;/strong&gt;，不碰 qmake、不碰手动 &lt;code&gt;.vcxproj&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;依赖一律走环境变量 + &lt;code&gt;find_package&lt;/code&gt;&lt;/strong&gt;，不在 &lt;code&gt;CMakeLists.txt&lt;/code&gt; 里硬编码路径。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Windows 端 IDE 是 VS2022 + CMake 项目模式&lt;/strong&gt;；Linux 端用 Qt Creator 或 VS Code。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="二目录结构约定windows-端"&gt;二、目录结构约定（Windows 端）&lt;/h2&gt;
&lt;p&gt;每个项目固定长这样：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;项目根目录&amp;gt;\&amp;lt;项目名&amp;gt;\
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── CMakeLists.txt
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── CMakePresets.json
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── CMakeUserPresets.json # 本地预设（不提交 Git）
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── .gitignore
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── README.md
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── src\ # 源码
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ ├── main.cpp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ ├── core\ # Boost 业务逻辑
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ │ ├── Service.h
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ │ └── Service.cpp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ └── vision\ # OpenCV 图像处理
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ ├── ImageProcessor.h
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ └── ImageProcessor.cpp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── include\ # 对外头文件（可选）
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── resources\ # 静态资源、图片（可选）
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── tests\ # 测试代码（可选）
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── third_party\ # 第三方源码（可选，一般不用）
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;└── out\ # 构建输出（不提交 Git）
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └── build\
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ├── debug\
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └── release\
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;关键点：&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>VS 向导 vs CMake 手建工程：一次取舍记录</title><link>https://www.sylgalaxy.xyz/posts/env-vs-wizard-or-cmake/</link><pubDate>Tue, 13 Oct 2026 00:00:00 +0000</pubDate><guid>https://www.sylgalaxy.xyz/posts/env-vs-wizard-or-cmake/</guid><description>&lt;p&gt;新建 C++ 项目时，用 VS2022 项目向导，还是手建目录 + CMake？核心结论：&lt;strong&gt;向导是「快」，CMake 手建是「稳」；长期维护的 Boost + OpenCV 项目走 CMake 手建路线。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="一完全不利用-vs-向导指什么"&gt;一、「完全不利用 VS 向导」指什么&lt;/h2&gt;
&lt;p&gt;VS 新建项目时，向导会自动生成：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;目录结构&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.vcxproj&lt;/code&gt; / &lt;code&gt;.sln&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;一些默认代码&lt;/li&gt;
&lt;li&gt;默认的编译配置&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;不用向导&lt;/strong&gt;，就是自己手建目录、手写 &lt;code&gt;CMakeLists.txt&lt;/code&gt;、用 VS 的「打开文件夹」模式加载。&lt;/p&gt;
&lt;h2 id="二cmake-手建的好处"&gt;二、CMake 手建的好处&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;好处&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;结构清晰、可控&lt;/td&gt;
&lt;td&gt;向导生成的项目，目录和配置是向导定的；手建时 &lt;code&gt;src/&lt;/code&gt;、&lt;code&gt;include/&lt;/code&gt;、&lt;code&gt;resources/&lt;/code&gt;、&lt;code&gt;tests/&lt;/code&gt; 怎么分，自己说了算&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;跨平台&lt;/td&gt;
&lt;td&gt;&lt;code&gt;CMakeLists.txt&lt;/code&gt; 是跨平台的：同一个项目，Windows 用 MSVC，WSL 用 GCC，不用改任何东西；向导生成的 &lt;code&gt;.vcxproj&lt;/code&gt; 只能在 VS 里用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;依赖管理统一&lt;/td&gt;
&lt;td&gt;Boost、OpenCV 全走 &lt;code&gt;find_package&lt;/code&gt;，环境变量一配，所有项目通用；向导的项目要手动一个个加 include、lib 路径&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;不污染仓库&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.vcxproj&lt;/code&gt;、&lt;code&gt;.sln&lt;/code&gt;、&lt;code&gt;.vs/&lt;/code&gt;、&lt;code&gt;out/&lt;/code&gt; 都是本地文件，不进 Git；CMake 项目只需提交 &lt;code&gt;CMakeLists.txt&lt;/code&gt; 和源码，干净&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;和工业界一致&lt;/td&gt;
&lt;td&gt;大多数 C++ 开源项目、跨平台项目都用 CMake；养成这个习惯，以后参与别人的项目、或自己发布项目，都顺&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;配置一次、项目复用&lt;/td&gt;
&lt;td&gt;环境变量和 &lt;code&gt;CMakeLists.txt&lt;/code&gt; 模板定好后，新建项目就是复制模板、改项目名、加源文件。&lt;strong&gt;增量配置，不是每次从零配&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="三cmake-手建的代价"&gt;三、CMake 手建的代价&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;初期配置复杂&lt;/strong&gt;。第一次要理解：&lt;code&gt;CMakeLists.txt&lt;/code&gt; 的语法、&lt;code&gt;find_package&lt;/code&gt; 怎么找库、环境变量怎么设、&lt;code&gt;CMakePresets.json&lt;/code&gt; 的格式。这些概念对新手是门槛。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;VS 集成不如原生项目「顺滑」&lt;/strong&gt;。向导项目是 VS 原生支持，调试、IntelliSense 开箱即用；CMake 项目通过「打开文件夹」或「CMake 项目」模式支持，功能也全，但偶尔会遇到配置识别问题。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;调试和 IDE 功能偶有摩擦&lt;/strong&gt;。断点、监视窗口、调用栈这些都没问题；但某些 VS 特有的功能（比如某些项目属性页面），在 CMake 项目里没有对应入口。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;学习曲线&lt;/strong&gt;。要同时学 CMake、学 Boost/OpenCV 的 CMake 配置。&lt;strong&gt;一次性投入大，但长期收益高。&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="四取舍小结"&gt;四、取舍小结&lt;/h2&gt;
&lt;p&gt;整体体验是：&lt;strong&gt;结构清晰，配置相对复杂；不过做项目时配置一次，后续只是增量配置。&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>VS2022 打开 CMake 项目的调试说明：断点与 launch.vs.json</title><link>https://www.sylgalaxy.xyz/posts/env-vs-cmake-debug/</link><pubDate>Tue, 13 Oct 2026 00:00:00 +0000</pubDate><guid>https://www.sylgalaxy.xyz/posts/env-vs-cmake-debug/</guid><description>&lt;p&gt;手建的 CMake 项目在 VS2022「打开文件夹」模式下的打开方式、自动生成的配置、断点调试与 &lt;code&gt;launch.vs.json&lt;/code&gt;。核心结论：&lt;strong&gt;CMake 项目的调试体验与向导项目基本一致，唯一多出的一步是手动选启动目标。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="一怎么用-vs-打开手建的-cmake-项目"&gt;一、怎么用 VS 打开手建的 CMake 项目&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;步骤：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;VS2022 → &lt;strong&gt;文件 → 打开 → 文件夹&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;选项目根目录，比如 &lt;code&gt;&amp;lt;项目根目录&amp;gt;\MyProject&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;VS 自动识别 &lt;code&gt;CMakeLists.txt&lt;/code&gt;，切换到 &lt;strong&gt;CMake 项目模式&lt;/strong&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;VS 会自动做的事：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;读 &lt;code&gt;CMakeLists.txt&lt;/code&gt;，配置 CMake。&lt;/li&gt;
&lt;li&gt;在项目根目录生成 &lt;code&gt;.vs/&lt;/code&gt;，存 VS 自己的状态。&lt;/li&gt;
&lt;li&gt;在 &lt;code&gt;out/build/&lt;/code&gt; 下生成构建产物。&lt;/li&gt;
&lt;li&gt;底部状态栏出现 &lt;strong&gt;配置选择器&lt;/strong&gt;（Debug/Release），和 &lt;strong&gt;CMake 目标选择器&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;和向导项目一样，VS 该自动生成的还是会生成。&lt;/p&gt;
&lt;h2 id="二vs-自动生成的配置有哪些"&gt;二、VS 自动生成的配置有哪些&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;和向导项目时一样：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;.vs/&lt;/code&gt;&lt;/strong&gt;：VS 的工作状态、索引、窗口布局。不提交 Git。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;out/&lt;/code&gt;&lt;/strong&gt;：CMake 构建产物。不提交 Git。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;CMakeUserPresets.json&lt;/code&gt;&lt;/strong&gt;：如果在 VS 里改过预设，它可能生成这个。不提交 Git。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;这些不影响项目结构本身&lt;/strong&gt;，只是 VS 的本地缓存，删了能重建。&lt;/p&gt;
&lt;h2 id="三断点怎么用"&gt;三、断点怎么用&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;CMake 项目的断点和向导项目完全一样。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="基本流程"&gt;基本流程&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;在代码行号左边点一下&lt;/strong&gt;，出现红点，就是断点。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;按 F5&lt;/strong&gt; 启动调试（不是 Ctrl+F5，Ctrl+F5 是不调试直接运行）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;程序运行到断点处停下&lt;/strong&gt;，VS 自动切换到调试界面。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;底部出现调试工具栏&lt;/strong&gt;：继续、单步跳过、单步进入、跳出。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;左侧或底部窗口&lt;/strong&gt;：局部变量、监视、调用栈、断点列表。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="常用快捷键"&gt;常用快捷键&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;操作&lt;/th&gt;
&lt;th&gt;快捷键&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;启动调试&lt;/td&gt;
&lt;td&gt;&lt;code&gt;F5&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;停止调试&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Shift + F5&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;单步跳过（不进入函数）&lt;/td&gt;
&lt;td&gt;&lt;code&gt;F10&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;单步进入（进入函数）&lt;/td&gt;
&lt;td&gt;&lt;code&gt;F11&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;跳出当前函数&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Shift + F11&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;继续运行&lt;/td&gt;
&lt;td&gt;&lt;code&gt;F5&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;切换断点&lt;/td&gt;
&lt;td&gt;&lt;code&gt;F9&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;条件断点&lt;/td&gt;
&lt;td&gt;右键断点 → 条件&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="cmake-项目特有的注意点"&gt;CMake 项目特有的注意点&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;1. 启动目标&lt;/strong&gt;&lt;/p&gt;</description></item></channel></rss>