You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在CMake中为多个文件使用EXCLUDE REGEX?

在CMake中使用EXCLUDE REGEX排除多个文件

嘿,我来帮你搞定CMake里用file(GLOB ...)排除多个文件的问题,顺带把你提到的相关疑问也一起讲明白!

先解决单个文件的排除需求

如果你只是想排除某一个特定文件,有两种常用方式:

  1. 先匹配所有文件再移除单个文件
    这种方式直观易懂,适合新手:
# 先匹配所有cpp文件
file(GLOB SOURCES "*.cpp")
# 匹配要排除的单个文件
file(GLOB FILE_TO_REMOVE "test.cpp")
# 从源文件列表里移除它
list(REMOVE_ITEM SOURCES ${FILE_TO_REMOVE})
  1. 直接用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.01 01:22:48