【问题标题】:CMake way to generate multiple projects from common source treeCMake方式从公共源代码树生成多个项目
【发布时间】:2016-03-05 01:16:28
【问题描述】:

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

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

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

注意事项:

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

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

任何建议将不胜感激。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 作为一般说明,提出一个带有无法解释的“不要像这样解决它”子句的关联列表的问题是非常无益的。如果你解释为什么你拒绝了他们每个人,其他人可能会发现你错过的东西,从而使他们成为你问题的解决方案!
    • 我实际上使用了 include() 以及“target_sources”来实现我希望的目标。这让我可以为每个目标创建一个单独的“mini-makefile”,以使目标特定设置和源不受大部分 CMake 逻辑的干扰。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 2015-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-14
    • 2011-02-09
    相关资源
    最近更新 更多