如何配置CLion将新建源文件及头文件自动添加至CMake变量
如何让CLion新建文件时自动更新指定CMakeLists.txt的变量
当然可以覆盖CLion的默认行为!它的文件模板功能允许我们自定义新建.cpp/.hpp文件时的逻辑,自动把文件路径添加到你指定的SRC和HEADERS变量里,而不是默认的add_executable中。下面是具体的实操方案:
1. 打开CLion的文件模板设置
打开CLion后,按以下路径进入设置:
- Windows/Linux:
File→Settings - Mac:
CLion→Settings
在设置窗口里,找到 Editor → File and Code Templates,切换到Files标签页——这里就是我们要修改的源文件和头文件模板所在位置。
2. 修改C++源文件(.cpp)模板
找到列表里的C++ Source File,点击右侧的编辑按钮,把模板内容替换成下面的代码(记得替换成你自己的项目路径和变量名):
#if ${INCLUDE_GUARD} #include "${HEADER_FILE}" #endif // 自动更新目标CMakeLists.txt的SRC变量 #[[ <#assign target_cmake = "${PROJECT_DIR}/src/CMakeLists.txt"> <!-- 替换成你的目标(1*)CMakeLists.txt路径 --> <#assign src_var = "SRC"> <!-- 你的源文件变量名 --> <#list FILES as file> <#assign rel_path = file.relativePath> <#if rel_path?starts_with("src/sources/")> <!-- 匹配你的源文件存放目录 --> <#file target_cmake append=true> set(${src_var} ${${src_var}} ${rel_path}) </#file> </#if> </#list> ]]
关键说明:
${PROJECT_DIR}是CLion内置宏,代表项目根目录,确保路径精准指向你的目标CMakeLists.txt。rel_path?starts_with("src/sources/")用来过滤:只有存放在src/sources/下的文件才会被添加到SRC变量中。
3. 修改C++头文件(.hpp)模板
同样在Files标签页找到C++ Header File,编辑模板内容如下:
#ifndef ${INCLUDE_GUARD} #define ${INCLUDE_GUARD} // 自动更新目标CMakeLists.txt的HEADERS变量 #[[ <#assign target_cmake = "${PROJECT_DIR}/src/CMakeLists.txt"> <!-- 同样替换成目标CMakeLists.txt路径 --> <#assign header_var = "HEADERS"> <!-- 你的头文件变量名 --> <#list FILES as file> <#assign rel_path = file.relativePath> <#if rel_path?starts_with("src/headers/")> <!-- 匹配你的头文件存放目录 --> <#file target_cmake append=true> set(${header_var} ${${header_var}} ${rel_path}) </#file> </#if> </#list> ]] #endif // ${INCLUDE_GUARD}
4. 调整你的CMakeLists.txt结构
确保你的目标CMakeLists.txt(1*)里已经初始化变量,并且在add_executable中正确引用它们:
# 目标CMakeLists.txt(1*) # 初始化空变量 set(SRC "") set(HEADERS "") # 后续CLion会自动往上面两个变量里追加新文件路径 add_executable(YourTargetName ${SRC} ${HEADERS})
而默认配置的CMakeLists.txt(2*)只需要包含目标所在的目录即可,不要直接往add_executable里添加文件:
# 默认配置CMakeLists.txt(2*) add_subdirectory(src)
验证效果
现在新建一个.cpp文件到src/sources/目录下,打开目标CMakeLists.txt,你会看到SRC变量已经自动追加了新文件的相对路径;新建.hpp到src/headers/目录,HEADERS变量也会同步更新。
如果遇到问题,优先检查:
- 模板里的路径是否和你的项目结构完全匹配
- 目标CMakeLists.txt是否有读写权限
- 模板中的FreeMarker语法(
<#...>部分)有没有拼写错误
内容的提问来源于stack exchange,提问作者IC_
相关产品推荐
相关产品推荐

