CMake set() 和 CMake file(Globe) 有什么区别?

What's the difference between CMake set() and CMake file(Globe)?

在我的项目 CMake 中,我使用 file(Globe ...):

file(GLOB SOURCES
   srcDir/srcA.cpp
   srcDir/srcB.cpp
   srcDir/srcC.cpp
   srcDir/srcD.cpp
 )

我读到 file(GLOB ...) 可以是邪恶的:, glob pros / cons

我能理解为什么不推荐使用带通配符的 file(GLOB ...)

file(GLOB SOURCES
   srcDir/*
 )

但我不明白 file(GLOB ...)set(...) 之间的区别,如果我将它用于特定文件的话:

file(GLOB SOURCES
   srcDir/srcA.cpp
   srcDir/srcB.cpp
   srcDir/srcC.cpp
   srcDir/srcD.cpp
 )

VS

set(SOURCES
   srcDir/srcA.cpp
   srcDir/srcB.cpp
   srcDir/srcC.cpp
   srcDir/srcD.cpp
 )

#############编辑##################

附带问题:使用 file(GLOB) 而不是 set() 的“价格”是多少?它会影响编译时间吗?

如果你 file 并且没有这样的文件,那么你可能会遇到链接错误(因为你有 headers,你的代码编译得很好,但是函数的实现不会由于缺少未添加到编译中的源文件而被找到,因此缺少链接)。

如果你这样做 set 并且没有这样的文件,你将得到 CMake 配置错误或编译错误(因为 CMake 会尝试将不存在的路径传递给编译器)。

然而

set 是一个非常快的操作(基本上将局部变量设置为某个常量),而 file 实际上需要深入遍历文件系统上的整个目录并为每个目录匹配一些模式途中的文件。如果您 GLOB 在非常 big/deep 的文件夹上,它可能会很慢。