【问题标题】:What's the difference between CMake set() and CMake file(Globe)?CMake set() 和 CMake file(Globe) 有什么区别?
【发布时间】:2021-07-05 12:28:00
【问题描述】:

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

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

我读到file(GLOB ...) 可能是邪恶的:cmake-file-glob-evil、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(GLOB) 搜索文件按给定的 glob(s) 并分配给变量仅找到的路径。 set无条件地将给定值赋给变量。
  • 谢谢@Tsyvarev,那么以这种方式使用file(glob) 与set() 有什么缺点吗?
  • 如果要分配则使用set,如果要搜索则使用fild(glob)。如果取决于你想要什么。
  • 如果你 file 并且没有这样的文件,你可能会得到链接错误(因为你有头文件和代码编译得很好,但是因为缺少源文件没有找到函数的实现添加到编译中,因此缺少链接)。如果你set 并且没有这样的文件,你会得到 CMake 配置错误或编译错误(因为 CMake 会尝试将不存在的路径传递给编译器)
  • 在中小型项目中,这种差异几乎不会被察觉,但set 显然物超所值,而file(GLOB) 可能需要一些时间,如果文件夹非常深并且包含数百个文件(这种情况很少见,除非是像 Boost 这样的大型存储库)。

标签: cmake glob


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2018-11-24
    • 2016-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-05
    • 2011-05-03
    • 1970-01-01
    相关资源
    最近更新 更多