【问题标题】:How could I match all subdirectories automatically with cmake如何使用 cmake 自动匹配所有子目录
【发布时间】:2019-03-27 16:43:01
【问题描述】:

如果我的项目是这样的:

|--main.cpp
  |-A--a1.cpp
  |   |-a2.cpp
  |
  |-B--b1.cpp
      |-b2.cpp
|--CMakeLists.txt

如何将所有*.cpp(例如main.cppA/a1.cppA/a2.cppB/b1.cppB/b2.cpp)添加到cmake变量SRC?我希望我只需要一个CMakeLists.txt。对了,如果我需要排除某些.cpps 怎么办?

【问题讨论】:

标签: c++ cmake


【解决方案1】:

这就是你想要的:

file(GLOB_RECURSE SRC *.cpp)

欲了解更多信息:https://cmake.org/cmake/help/v3.0/command/file.html

对于排除你可以写函数。

注意:但我不建议使用“glob”。 最好将“设置”与文件列表一起使用。

【讨论】:

  • 这个支持子目录匹配吗?
  • @coincheung 是的,会遍历所有子目录
  • 那我怎么能绕过某些名字的文件呢?
  • 这个命令没有这个选项,但是你可以使用 list(REMOVE_ITEM ... )。 cmake.org/cmake/help/v3.0/command/list.html
【解决方案2】:

正如 Alexander 所说,您可以使用 file(GLOB_RECURSE myVar myRegex) 将与 myRegex 匹配的所有文件作为列表放入 myVar 中。为了排除一些您可以使用 myRegex,或者您可以使用 list(FILTER myVar <INCLUDE|EXCLUDE> REGEX <regular_expression>) 过滤列表

但请注意,在您的项目中添加另一个 .cpp 文件不会在重建时自动添加到您的目标中。您将需要明确地重新配置您的项目以进行更改。从 CMake 3.12 开始,还有一个选项 CONFIGURE_DEPENDS 用于文件 GLOBE 和 GLOBE_RECURSE,它将为您进行重建更新。

这是 CMake 文档中的注释:

注意我们不建议使用 GLOB 来收集源文件列表 从你的源代码树。如果没有 CMakeLists.txt 文件更改时源 添加或删除,则生成的构建系统无法知道何时 要求 CMake 重新生成。 CONFIGURE_DEPENDS 标志可能不起作用 在所有发电机上可靠,或者如果在 无法支持它的未来,使用它的项目将被卡住。甚至 如果 CONFIGURE_DEPENDS 工作可靠,仍然需要执行成本 检查每次重建。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-31
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多