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

