一尘不染

用 GLOB 指定源文件还是在 CMake 中单独指定每个文件更好?

javascript

CMake 提供了几种方法来指定目标的源文件。一种是使用通配符(文档),例如:

FILE(GLOB MY_SRCS dir/*)

另一种方法是单独指定每个文件。

首选哪种方式?通配似乎很容易,但我听说它有一些缺点。


阅读 112

收藏
2022-07-12

共1个答案

一尘不染

全面披露:我最初更喜欢 globbing 方法,因为它简单,但多年来我已经认识到,明确列出文件对于大型、多开发人员项目不太容易出错。

原答案:


globbing 的优点是:

  • 添加新文件很容易,因为它们只列在一个地方:磁盘上。不通配会产生重复。
  • 您的 CMakeLists.txt 文件会更短。如果您有很多文件,这是一个很大的优势。不通配会导致您在大量文件中丢失 CMake 逻辑。

使用硬编码文件列表的优点是:

  • CMake 将正确跟踪磁盘上新文件的依赖关系 - 如果我们使用 glob,那么当您运行 CMake 时第一次没有被 glob 的文件将不会被拾取
  • 您确保只添加您想要的文件。通配可能会拾取您不想要的杂散文件。

为了解决第一个问题,您可以简单地“触摸”执行 glob 的 CMakeLists.txt,方法是使用 touch 命令或写入文件而不进行任何更改。这将强制 CMake 重新运行并获取新文件。

要解决第二个问题,您可以将代码仔细组织到目录中,无论如何您都可能这样做。在最坏的情况下,您可以使用以下list(REMOVE_ITEM)命令清理文件的全局列表:

file(GLOB to_remove file_to_remove.cpp)
list(REMOVE_ITEM list ${to_remove})

唯一能咬到你的真实情况是,如果你使用git-bisect之类的东西在同一个构建目录中尝试旧版本的代码。在这种情况下,您可能需要清理和编译更多内容,以确保您在列表中获得正确的文件。这是一个极端的案例,而且你已经在你的脚趾上,这不是一个真正的问题。

2022-07-12