🔥 别再手写 CMakeLists.txt 了!这个开源神器让我彻底解放了
- Gitee 地址:https://gitee.com/cjuer512/easycmake
一、楔子:一个 C++ 开发者的日常崩溃
先问大家一个问题——
当你心血来潮的想写个C/C++项目,高高兴兴写完文件,该配置构建了,是否看着CMake就头痛?
奇葩的语法,逆天的关键词,用deepseek?折磨。
费尽千辛万苦,从别的地方复制粘贴个CMake,改了改,然后一定经历过以下场景:
场景一:
add_executable(my_app main.cpp utils.cpp network.cpp database.cpp config.cpp ... 还有二十个文件)然后你发现拼错了一个文件名。CMake 给你一个看不懂的错误。你盯着屏幕,开始怀疑人生。
场景二:
你只是想给自己的项目加几个编译选项:
-Wall 怎么写的来着?是
add_compile_options还是set(CMAKE_CXX_FLAGS?
不对,应该是target_compile_options…… 哎算了全写上吧反正也没事。
场景三:
你有一个文件需要特殊优化,其他文件正常编译。你打开了 CMake 文档,搜索了半小时,终于知道有set_source_files_properties这个东西。然后花十分钟搞懂了语法。
场景四:
你换了个项目。之前的 CMake 配置全忘了。重新从头写。
——请问,这浪费时间吗?
我知道你要说什么:
“CMake 是行业标准,你逃不掉的。”
对,逃不掉。但我们可以让它变得不那么恶心。
于是我花了点时间,写了一个小工具——
🚀 EasyCMake:可视化 CMake 配置工具
先看效果:
┌──────────────────────────────────────────────────────────┐ │ ⚙️ easycmake — CMake 可视化配置工具 │ │ ┌──────────────┐ ┌──────────────────────────────────┐ │ │ │ 项目基本信息 │ │ CMakeLists.txt 预览 │ │ │ │ 项目名称 xxx │ │ # ============================= │ │ │ │ 版本号 1.0.0 │ │ cmake_minimum_required(...) │ │ │ │ C++ 标准 C++17│ │ project(xxx VERSION 1.0.0) │ │ │ ├──────────────┤ │ add_executable(xxx │ │ │ │ 可执行文件配置 │ │ main.cpp │ │ │ │ → main_app │ │ ) │ │ │ │ main.cpp │ │ target_include_directories(...) │ │ │ │ utils.cpp │ │ ... │ │ │ ├──────────────┤ │ ... │ │ │ │ 编译/链接选项 │ │ ... │ │ │ │ ☑ -Wall ☑ -O2│ └──────────────────────────────────┘ │ │ └──────────────┘ │ └──────────────────────────────────────────────────────────┘左边填表,右边实时预览。填完点一下「生成」,CMakeLists.txt 就到手了。
简单到令人发指。
但是我做这个工具的时候,想的不仅仅是"做个填表生成器"。我想要的是——
💡 解决真实痛点
痛点一:记不住命令 → 可视化表单
target_include_directories 的语法是什么来着? 第二个参数是 PUBLIC 还是 PRIVATE? find_package 的版本范围是用两个参数还是三个?EasyCMake 把这些全部变成了表单和选项。选就完事了。
痛点二:要改源文件就要改 CMake → 动态添加
新加了一个crypto_worker.cpp?
在界面上敲个逗号,加个文件名,重新生成。完事。
痛点三:不同文件需要不同编译参数 → 单文件编译选项(杀手锏)
这才是这个工具最值钱的功能。
真实项目中,你经常需要:
| 文件 | 需求 | 原因 |
|---|---|---|
main.cpp | -O3 -march=native | 性能核心,往死里优化 |
debug_helper.cpp | -O0 -g3 -DDEBUG | 调试工具,不能优化 |
avx_module.cpp | -mavx2 -mfma | 要用 AVX2 指令集 |
legacy_code.c | -std=c99 | 老代码,用 C99 编译 |
在 EasyCMake 里怎么做?
- 填写源文件列表:
main.cpp, debug_helper.cpp, avx_module.cpp - 点击「单文件编译选项」按钮
- 每个文件弹出一个输入框,爱写什么写什么
生成的 CMake:
# --- main_app 单文件特殊编译选项 --- set_source_files_properties(main.cpp PROPERTIES COMPILE_FLAGS "-O3 -march=native") set_source_files_properties(debug_helper.cpp PROPERTIES COMPILE_FLAGS "-O0 -g3 -DDEBUG") set_source_files_properties(avx_module.cpp PROPERTIES COMPILE_FLAGS "-mavx2 -mfma")精确到每个文件。不再需要把整个项目的优化级别设成 -O0 来迁就一个调试文件。
说真的,光这个功能就值得你 star 一下这个项目。
痛点四:配置不能复用 → 保存 / 加载
项目的 CMake 配置可以保存为 JSON 文件。下次打开自动加载。
换个项目?再配一套。
换个同事来维护?把 JSON 丢给他。
🎮 实际操作:30 秒生成一个完整项目
来,我手把手带你走一遍。
假设我们要写一个叫my_server的服务端程序,用了 OpenSSL 和 Zlib,有测试用例,还想对其中一个加密文件做特殊优化。
第一步:打开 EasyCMake
pipinstallflask jinja2 python3 easycmake.py浏览器自动打开。
第二步:填项目信息
项目名my_server,版本1.2.0,C++20,编译模式 Release。
第三步:加可执行文件
填名称my_server,源文件main.cpp, config.cpp, crypto_worker.cpp。
往下面的「包含目录」填include, generated,「宏定义」填APP_VERSION="1.2.0", ENABLE_TLS。
第四步:单文件特殊优化
点击**「单文件编译选项」**,面板展开:
crypto_worker.cpp→ 输入-O3 -march=native -maes- 其他文件不动
第五步:加依赖、开测试
添加 OpenSSL 依赖,打开测试开关,加两个测试用例。
第六步:点击「生成」
✅ 已生成 CMakeLists.txt(保存至:/xxx/CMakeLists.txt)右边预览区已经显示完整的 CMake 内容了。
整个过程不超过 30 秒。
📦 都支持哪些 CMake 功能?
我把最常用的 CMake 命令全包进去了,一张表看清楚:
| 功能 | 对应 CMake 命令 | EasyCMake 操作 |
|---|---|---|
| 项目信息 | project()cmake_minimum_required() | 填表 |
| C++ 标准 | CMAKE_CXX_STANDARD | 下拉选择 11/14/17/20/23 |
| 构建类型 | CMAKE_BUILD_TYPE | 下拉选择 Debug/Release |
| 可执行文件 | add_executable() | 添加一行 |
| 静态/动态库 | add_library() | 添加一行 + 选择类型 |
| 包含目录 | target_include_directories()include_directories() | 填逗号分隔的路径 |
| 宏定义 | target_compile_definitions() | 填逗号分隔的宏 |
| 链接库 | target_link_libraries() | 填库名 |
| 🔥 单文件选项 | set_source_files_properties() | 展开面板,逐文件填写 |
| 第三方依赖 | find_package() | 填包名 + 版本范围 |
| 子目录 | add_subdirectory() | 填逗号分隔的路径 |
| 编译选项 | add_compile_options() | 开关 + 下拉 + 自定义输入 |
| 链接选项 | add_link_options() | 自定义输入 |
| Sanitizer | -fsanitize=address等 | 下拉选择 |
| LTO | -flto | 开关 |
| 导出编译命令 | CMAKE_EXPORT_COMPILE_COMMANDS | 开关(默认开启) |
| 安装规则 | install(TARGETS ...) | 开关 + 填目录 |
| 测试 | enable_testing()add_test() | 开关 + 添加测试用例 |
全不全?你还想要什么功能?来提 issue,我加。
🎨 说点设计上的小心思
这个工具有几个我认为做得还不错的地方:
深色主题,VS Code 风格
背景 #1e1e1e,卡片 #252526,代码预览 #1a1a2e作为一个开发者,每天看亮色背景对我眼睛是种酷刑。所以默认就是暗色,而且配色调了很久,看着很舒服。
实时预览,所见即所得
右侧的预览区在你每次「生成」或「预览」时都会更新。不用切出去看文件。填完表,右边就是完整的 CMakeLists.txt,可以直接复制。
一键复制
预览区的右上角有一个复制按钮,点一下就把内容复制到剪贴板了。不用选中、Ctrl+C、担心选漏了。
配置持久化
配置保存在easycmake_config.json。下次启动自动加载。关掉浏览器再打开,一切还在。
💪 技术栈
- 后端:Python + Flask(轻量、稳定)
- 模板:Jinja2(业界最流行的 Python 模板引擎)
- 前端:Vanilla JS(零依赖,启动即用)
- 样式:Bootstrap 5 + 自定义暗色主题
- 生成原理:JSON 配置 → Jinja2 渲染 → CMakeLists.txt
整个项目只有一个入口、五个核心文件、一千多行代码。小而美。
🌟 写在最后
我做这个工具的初衷很简单——
我讨厌写 CMakeLists.txt。
不是我一个人讨厌,我身边的所有 C++ 开发者都讨厌。但它是行业标准,逃不掉。那既然逃不掉,就想办法让它别那么痛苦。
EasyCMake 不会帮你写业务代码,不会帮你 debug,不会帮你优化算法。但它能帮你在构建配置这件事上省下 90% 的时间。
这 90% 的时间,你可以用来做什么?
写更好的代码。读更多的书。陪家人吃顿饭。
或者——来 Gitee 点个 star 也行 😄
🔗 相关链接
- Gitee 地址:https://gitee.com/cjuer512/easycmake
- 安装方式:
pip install flask jinja2 && python3 easycmake.py - 提交 Issue:发现 Bug 或有新想法,欢迎提交
📌 求点赞
如果这篇文章对你有帮助:
- ⭐开源项目点个 Star— 让更多被 CMake 折磨的人看到这个项目
- 📢转发给身边的 C++ 开发者— 他们需要这个
- 💬评论区留言— 说说你被 CMake 坑过的最惨的一次经历