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

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

提问人:lior.i 提问时间:7/5/2021 最后编辑:lior.i 更新时间:7/13/2021 访问量:297

问:

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

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

我读到这可能是邪恶的:cmake-file-glob-evil,glob 优点/缺点file(GLOB ...)

我可以理解为什么不建议使用通配符:file(GLOB ...)

file(GLOB SOURCES
   srcDir/*
 )

但是我不明白如果我将它与特定文件一起使用,那两者之间的区别:file(GLOB ...)set(...)

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

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

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

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

CMake 全球

评论

2赞 Tsyvarev 7/5/2021
file(GLOB) 按给定的 glob 搜索文件,并仅将已找到的路径分配给变量。 无条件地将给定值分配给变量。set
0赞 lior.i 7/5/2021
谢谢@Tsyvarev,那么以这种方式使用 vs 有什么缺点吗?file(glob)set()
0赞 Tsyvarev 7/5/2021
如果要分配,请使用 ,如果要搜索,请使用 。如果取决于你想要什么。setfild(glob)
1赞 Alexey S. Larionov 7/5/2021
如果你没有这样的文件,你可能会得到链接错误(因为你的标头和代码编译得很好,但找不到函数的实现,因为缺少的源文件没有添加到编译中,因此缺少链接)。如果没有这样的文件,则会出现 CMake 配置错误或编译错误(因为 CMake 会尝试将不存在的路径传递给编译器)fileset
2赞 Alexey S. Larionov 7/5/2021
在中小型项目中,这种差异几乎不明显,但显然与没有一样便宜,而如果文件夹非常深并且包含数百个文件,则可能需要一些时间(这种情况很少见,除非它是像 Boost 这样的大型存储库)。setfile(GLOB)

答:

1赞 Alexey S. Larionov 7/13/2021 #1

如果你这样做了,但没有这样的文件,那么你可能会得到链接错误(因为你有标头,你的代码编译得很好,但找不到函数的实现,因为缺少未添加到编译中的源文件,因此缺少链接)。file

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

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