CMake 提供了几种方法来指定目标的源文件。一种是使用通配符(文档),例如:
FILE(GLOB MY_SRCS dir/*)
另一种方法是单独指定每个文件。
首选哪种方式?通配似乎很容易,但我听说它有一些缺点。
全面披露:我最初更喜欢 globbing 方法,因为它简单,但多年来我已经认识到,明确列出文件对于大型、多开发人员项目不太容易出错。
原答案:
globbing 的优点是:
添加新文件很容易,因为它们只列在一个地方:磁盘上。不通配会产生重复。
您的 CMakeLists.txt 文件会更短。如果您有很多文件,这是一个很大的优势。不通配会导致您在大量文件中丢失 CMake 逻辑。
使用硬编码文件列表的优点是:
CMake 将正确跟踪磁盘上新文件的依赖关系 - 如果我们使用 glob,那么当您运行 CMake 时第一次没有被 glob 的文件将不会被拾取
您确保只添加您想要的文件。通配可能会拾取您不想要的杂散文件。
为了解决第一个问题,您可以简单地“触摸”执行 glob 的 CMakeLists.txt,方法是使用 touch 命令或写入文件而不进行任何更改。这将强制 CMake 重新运行并获取新文件。
要解决第二个问题,您可以将代码仔细组织到目录中,无论如何您都可能这样做。在最坏的情况下,您可以使用以下list(REMOVE_ITEM)命令清理文件的全局列表:
list(REMOVE_ITEM)
file(GLOB to_remove file_to_remove.cpp) list(REMOVE_ITEM list ${to_remove})
唯一能咬到你的真实情况是,如果你使用git- bisect之类的东西在同一个构建目录中尝试旧版本的代码。在这种情况下,您可能需要清理和编译更多内容,以确保您在列表中获得正确的文件。这是一个极端的案例,而且你已经在你的脚趾上,这不是一个真正的问题。