CMake从公共源树

时间:2016-03-05 01:16:29

标签: c++ xcode visual-c++ cmake

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

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

我想知道如何有效地创建一个可以创建我需要的CMakeList.txt。

注意:

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

我完全满足于从某个地方的巨型列表中手动添加/删除源文件...理想情况下,可能被CMake吸收的外部文件。例如。 SourceFilesForBinary1.txt,SourceFilesForBinary2.txt等但我不知道该怎么做或者那是疯了。

任何建议都将受到赞赏。

1 个答案:

答案 0 :(得分:1)

CMake具有包含功能。您可以使用它来实现“巨型手动管理列表某处”解决方案。

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

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