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
相关产品推荐
相关产品推荐

