You need to enable JavaScript to run this app. CMake指定明确文件时set()与file(GLOB)的区别及使用开销
优惠活动
大模型
产品
解决方案
定价
更多

CMake指定明确文件时set()与file(GLOB)的区别及使用开销

CMake中指定具体文件时file(GLOB)与set()的差异及开销说明

核心功能差异

  • set(SOURCES ...)是纯粹的CMake变量赋值操作:你写的路径会原封不动直接存入SOURCES变量,CMake不会校验这些文件是否真实存在,也不会触发任何文件系统查询操作。就算你写错了路径,set本身也不会报错,只有到后续编译阶段找源文件时才会抛出错误。
  • file(GLOB SOURCES ...)哪怕你传入的是固定的具体文件路径,也会触发实际的文件系统扫描:CMake会逐个检查你写的路径是否存在,只有真实存在的文件路径才会被赋值给SOURCES变量,不存在的路径会被自动过滤,不会直接报错。

额外开销与编译时长影响

  • 仅CMake配置阶段存在可忽略的微小开销:file(GLOB)的额外开销只发生在你执行cmake命令的配置阶段,本质是多了若干次文件存在性查询的IO操作,只要你指定的文件数量在数百个以内,这个开销完全可以忽略,用户基本感知不到。
  • 编译阶段无任何额外开销:CMake配置完成后,SOURCES变量存储的就是最终的路径列表,不管是通过set还是file(GLOB)生成的,后续传给编译器的参数完全一致,不会对编译时长产生任何影响。
  • 特殊情况:如果你给file(GLOB)加上了CONFIGURE_DEPENDS参数,那么每次执行构建命令(如make、ninja)时都会重新运行一次GLOB扫描,会多出几毫秒到几十毫秒的构建前检测开销,对于正常规模的项目来说也不会明显拉长整体编译时长。

使用建议

哪怕你指定的是固定具体文件列表,也更推荐用set()而非file(GLOB):如果后续某个源文件被误删、移动,set()会在编译阶段直接抛出「找不到源文件」的明确错误,排查成本很低;而file(GLOB)会直接忽略不存在的文件,可能导致后续出现链接失败、功能缺失等更难定位的问题。

内容的提问来源于stack exchange,提问作者lior.i

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 04:12:02