CMake
add_executable
的{{3}}给出了以下命令规范:
add_executable(<name> [WIN32] [MACOSX_BUNDLE]
[EXCLUDE_FROM_ALL]
source1 [source2 ...])
我现在有一个包含大量资源的相当大的项目,并且想知道是否可以将目录添加为add_executable
的参数而不是单独指定每个源文件?如果没有,是否有关于如何处理这种情况的最佳做法或建议?我无法想象这样做的唯一方法是单独添加每个源文件?那么(对于(真的)大型项目如何工作,这似乎不是一种优雅的方法......
答案 0 :(得分:0)
最佳做法是手动列出所有文件。
特别是,为此目的,CMake文档warn about using GLOB:
我们不建议使用GLOB从中收集源文件列表 你的源代码树。如果源没有更改CMakeLists.txt文件 添加或删除然后生成的构建系统无法知道何时 让CMake重新生成。
这一点有点争议,因为许多开发人员更喜欢构建系统只是自动调整到新添加的文件。这种自动化的代价是构建脚本的脆弱性增加。
每当添加或删除文件时,您都必须记住手动重新运行CMake。您还必须确保磁盘上文件的物理布局与要构建的项目的逻辑布局相匹配。后一点可以说是这里更大的问题。通过将构建系统与磁盘上的文件分离,您可以添加额外的安全网,但是您必须通过增加构建脚本维护成本来支付它。
显式方法的最大缺点是imho,如果你忘记向CMakeLists添加一个新文件,你可能会想知道奇怪的链接器错误一段时间后才意识到你的错误。我个人认为这种方法的维护开销是可以接受的。当然,您的构建脚本中会有一个冗长的文件列表,但您不必经常触摸它,这些更改通常很简单。
由于这一点有点争议,如果您想为项目使用GLOB,我不会责怪您。只要知道后果,并准备好所有酷孩子都会嘲笑你,如果你的构建因此而破坏了一天。