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



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

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

我读到file(GLOB ...)可能是邪恶的:cmake文件glob邪恶,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
)

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

附带问题:";价格;使用CCD_ 7而不是CCD_?它会影响编译时间吗?

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

如果您执行set,但没有这样的文件,您将得到CMake配置错误或编译错误(因为CMake将尝试将不存在的路径传递给编译器(。

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

最新更新