CMake指令:aux_source_directory
目录
1.简介
2.常见使用场景
3.注意事项
4.替代方案
5.总结
相关链接
1.简介
aux_source_directory
是 CMake 中用于收集源文件的命令,可自动将指定目录下的所有源文件添加到变量中。
基本语法:
aux_source_directory(<dir> <variable>)
<dir>
:源文件所在目录(相对路径或绝对路径)。<variable>
:存储源文件列表的变量名。
核心作用就是自动收集指定目录下的所有 C/C++ 源文件(.c
、.cpp
、.cc
等),避免手动列出每个文件。例如:
# 收集 src/ 目录下的所有源文件到 SRC_LIST 变量
aux_source_directory(src SRC_LIST)# 添加可执行文件,使用收集的源文件
add_executable(my_app ${SRC_LIST})
2.常见使用场景
1.简单项目
# CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(MyApp)# 收集当前目录下的所有源文件
aux_source_directory(. SRC_FILES)# 添加可执行文件
add_executable(my_app ${SRC_FILES})
2.多目录项目
# CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(MyApp)# 收集多个目录的源文件
aux_source_directory(src/core CORE_SRC)
aux_source_directory(src/gui GUI_SRC)# 合并源文件列表
set(ALL_SRC ${CORE_SRC} ${GUI_SRC})# 添加可执行文件
add_executable(my_app ${ALL_SRC})
3.注意事项
1.不递归搜索子目录
aux_source_directory
默认只收集指定目录下的文件,不包含子目录。- 解决方案:对每个子目录单独调用
aux_source_directory
:
aux_source_directory(src/core CORE_SRC)
aux_source_directory(src/plugins PLUGIN_SRC)
2.可能包含不需要的文件
- 若目录中包含测试文件或临时文件,会被一并收集。
- 解决方案:改用
file(GLOB ...)
精确控制:
file(GLOB SRC_FILES "src/*.cpp" "src/*.c") # 只收集 .cpp 和 .c 文件
3.CMake 缓存问题
- 新增源文件时,CMake 可能不会自动重新扫描目录。
- 解决方案:手动删除
CMakeCache.txt
或使用cmake -E touch CMakeLists.txt
触发重新配置。
4.不推荐用于生产环境
- 官方文档指出:
aux_source_directory
可能导致意外文件被编译,建议优先使用file(GLOB ...)
或显式列出文件。
4.替代方案
1.使用 file(GLOB)
(更灵活)
# 收集 src/ 目录下的所有 .cpp 文件(不递归)
file(GLOB SRC_FILES "src/*.cpp")# 递归收集 src/ 及其子目录下的所有 .cpp 文件
file(GLOB_RECURSE SRC_FILES "src/*.cpp")
2.显式列出文件(最推荐)
add_executable(my_appsrc/main.cppsrc/utils.cppsrc/gui/window.cpp
)
5.总结
aux_source_directory
是快速收集源文件的便捷工具,但存在局限性(如不递归、缓存问题)。在实际项目中,建议根据规模和需求选择合适的方法:
- 快速原型:
aux_source_directory
- 生产环境:显式列出文件或
file(GLOB)
- 需要递归:
file(GLOB_RECURSE)
通过合理选择,可平衡开发效率与项目可控性。
相关链接
- CMake 官网 CMake - Upgrade Your Software Build System
- CMake 官方文档:CMake Tutorial — CMake 4.0.2 Documentation
- CMake 源码:https://github.com/Kitware/CMake
- CMake 源码:CMake · GitLab
- 中文版基础介绍: CMake 入门实战 | HaHack
- wiki: Home · Wiki · CMake / Community · GitLab