如何在CMake中为多个文件使用EXCLUDE REGEX?
在CMake中使用EXCLUDE REGEX排除多个文件
嘿,我来帮你搞定CMake里用file(GLOB ...)排除多个文件的问题,顺带把你提到的相关疑问也一起讲明白!
先解决单个文件的排除需求
如果你只是想排除某一个特定文件,有两种常用方式:
- 先匹配所有文件再移除单个文件
这种方式直观易懂,适合新手:
# 先匹配所有cpp文件 file(GLOB SOURCES "*.cpp") # 匹配要排除的单个文件 file(GLOB FILE_TO_REMOVE "test.cpp") # 从源文件列表里移除它 list(REMOVE_ITEM SOURCES ${FILE_TO_REMOVE})
- 直接用EXCLUDE REGEX匹配单个文件
如果想一步到位,可以直接在file(GLOB)里加正则,注意正则里的.要转义(CMake的正则语法要求),结尾的$确保完全匹配文件名,避免误删类似test_abc.cpp的文件:
file(GLOB SOURCES "*.cpp" EXCLUDE REGEX "test\\.cpp$")
用一条正则排除多个文件
这才是你最关心的点——用单个EXCLUDE REGEX规则排除多个文件。核心是利用正则的|(或)语法,把要排除的文件名规则用|分隔,包裹在括号里即可:
比如要排除test.cpp、demo.cpp和utils.hpp三个文件,可以这么写:
file(GLOB SOURCES "*.cpp" "*.hpp" # 匹配所有cpp和hpp文件 EXCLUDE REGEX "(test\\.cpp$|demo\\.cpp$|utils\\.hpp$)" )
进阶:排除一类文件
如果要排除的是某一类文件(比如所有测试文件),还可以写更通用的正则:
# 排除所有以_test.cpp结尾的文件 file(GLOB SOURCES "*.cpp" EXCLUDE REGEX "_test\\.cpp$") # 排除src/test目录下的所有文件 file(GLOB SOURCES "src/*.cpp" EXCLUDE REGEX "src/test/.*")
小提醒
虽然file(GLOB)用起来很方便,但CMake官方其实更推荐手动列出所有源文件——因为GLOB不会自动检测文件的新增或删除,可能导致构建系统缓存过期。如果你的项目文件变动不频繁,或者已经有自动更新缓存的机制,那用GLOB完全没问题。
内容的提问来源于stack exchange,提问作者mv402506
相关产品推荐
相关产品推荐

