CMake 从公共源代码树生成多个项目的方法

CMake way to generate multiple projects from common source tree

本文关键字:项目 方法 源代码 CMake      更新时间:2023-10-16

我的C++项目非常大,导致生成 5 个不同的二进制文件。例如,在VStudio中,我的单个解决方案有5个不同的"项目"。例如,在XCode中,我的单个项目有5个不同的目标。

代码组织在一个非常深的"src"文件夹中,其中包含许多级别的嵌套子文件夹。此 src 文件夹对于所有 5 个二进制文件都是通用的,因为大部分源代码都大量重用,但每个二进制文件都需要一些源代码,但不是全部。

我想知道如何有效地创建一个CMakeList.txt它可以在这里创建我需要的东西。

笔记:

  • 将代码重新组织成不同的结构不是一种选择,也不是使代码成为一堆静态库。
  • 每个子文件夹的 CMakeList.txt 不是一个选项。它们太多了,维护将是一场噩梦。
  • 文件(GLOB_RECURSE也不是一个好的选择,因为它会为每个二进制文件获取大量源文件,而这些文件对于该特定二进制文件进行编译是不必要的。
  • 理想情况下,将生成一个XCode项目(具有5个目标)或ONE VStudio解决方案(具有5个项目)。我不希望打开 5 个不同的项目。

我会完全满足于必须从某处的巨大列表中手动添加/删除源文件......理想情况下,在可以被CMake吸收的外部文件中。例如 SourceFilesForBinary1.txt、SourceFilesForBinary2.txt等,但我不确定该怎么做,或者这是否是疯狂的。

任何建议将不胜感激。

CMake 有一个包含函数。您可以使用它来实现"某处巨大的手动管理列表"解决方案。

你知道GLOB_RECURSE被赋予一个模式,对吧,所以它排除了无趣的文件?即使没有,在任何地方都可以使用GLOB_RECURSE也可以使用包含和邪恶的手动管理列表。

我不确定你为什么不想要静态库。这些是解决这个问题的好方法。对于像这样的一大堆共享代码,如果您将其编译为可重定位的静态库一次,然后将其与 LTO 链接到您的各种用途中,则可以避免多次重新编译源代码。如果你使用的是一个共享库(所以静态库方法会使你所有未使用的符号消失),你可以使用 --whole-archive 编译器开关来保留它们。