file(GLOB ...)
命令用于获取匹配指定模式的文件列表。在 CMake 中,file(GLOB ...)
命令的一种常见用法是用于收集源文件列表,例如 C++ 源文件(.cpp
)和 C 源文件(.c
)。然而,需要注意一些潜在的问题,特别是在大型项目中。
基本语法
file(GLOB variable [LIST_DIRECTORIES true|false] [RELATIVE path] [CONFIGURE_DEPENDS] [globbingexpressions]...)
其中:
variable
是一个存储匹配文件列表的变量名。LIST_DIRECTORIES
是一个可选的参数,用于指定是否包含目录,默认为true
。RELATIVE path
是一个可选的参数,用于指定相对路径,文件匹配将从这个相对路径开始。CONFIGURE_DEPENDS
是一个可选的参数,用于指定是否在构建时重新计算文件依赖关系。
使用例子
以下是一个使用 file(GLOB ...)
命令获取 C++ 和 C 源文件列表的例子:
file(GLOB CPP_SOURCES *.cpp)
file(GLOB C_SOURCES *.c)
# 将 C++ 和 C 源文件合并到一个变量中
set(SOURCES ${CPP_SOURCES} ${C_SOURCES})
# 在 add_executable 或 add_library 中使用这个变量
add_executable(my_executable ${SOURCES})
潜在的问题
虽然使用 file(GLOB ...)
简便,但有一些潜在的问题:
-
不会自动检测新增或删除的文件: 使用
file(GLOB ...)
时,CMake 不会自动检测源文件的变化,因此在添加或删除源文件时,需要手动重新运行 CMake。 -
不建议在大型项目中使用: 对于大型项目,由于可能包含大量的源文件,使用
file(GLOB ...)
可能会导致性能问题。
大型项目中推荐的用法
在大型项目中,推荐使用显式列出源文件的方式,例如:
set(SOURCES
src/file1.cpp
src/file2.cpp
src/file3.cpp
# ...
src/main.cpp
)
add_executable(my_executable ${SOURCES})
这样可以更明确地指定源文件,避免潜在的问题。