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

CMake file命令正则规则报错‘Invalid escape sequence \.’的解决问询

解决CMake匹配.c文件并排除.in.c文件的问题

我来帮你搞定这个CMake文件匹配的坑!

问题1:正则转义错误的原因与修复

你最初写的file(GLOB SOURCES "^[^.]+(?!\.in)\.c")报错“Invalid escape sequence .”,是因为在CMake的字符串中,单个反斜杠\会被当作转义字符处理,而你需要匹配的是字面意义的.,所以得把反斜杠双重转义,或者用CMake的原始字符串语法(CMake 3.12及以上支持)。

修复后的两种写法:

  • 双重转义版:
    file(GLOB SOURCES "^[^.]+(?!\\.in)\\.c")
    
  • 原始字符串版(更直观,避免转义麻烦):
    file(GLOB SOURCES [[^[^.]+(?!\.in)\.c]])
    

不过说实话,这种正则写法有点复杂,其实有更简单的替代方案。

问题2:用list(FILTER)替代list(REMOVE_ITEM)实现排除

你尝试用file(GLOB SOURCES "*.c") list(REMOVE_ITEM SOURCES "*.in.c")失败,是因为list(REMOVE_ITEM)不支持通配符或正则匹配,它只能移除列表中完全匹配的具体文件名。这时候应该用list(FILTER)命令,它专门支持正则过滤列表内容:

# 先匹配所有.c文件
file(GLOB SOURCES "*.c")
# 过滤掉所有以.in.c结尾的文件
list(FILTER SOURCES EXCLUDE REGEX "\\.in\\.c$")

这个写法更简洁易懂,也能准确达到你要的效果——保留所有anything.c,排除anything.in.c。

小提示

虽然file(GLOB)用起来方便,但CMake官方其实不推荐依赖它,因为当你新增或删除文件时,CMake不会自动重新生成构建文件,需要手动重新运行CMake。如果项目规模不大,这个问题影响不大;如果是大型项目,最好还是手动列出源文件哦。

内容的提问来源于stack exchange,提问作者user6791424

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 08:52:28