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 的文件夹上,它可能会很慢。
在我的项目 CMake
中,我使用 file(Globe ...)
:
file(GLOB SOURCES
srcDir/srcA.cpp
srcDir/srcB.cpp
srcDir/srcC.cpp
srcDir/srcD.cpp
)
我读到 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
)
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 的文件夹上,它可能会很慢。