c++ - CMake 从公共(public)源代码树生成多个项目的方法

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

我的 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 等,但我不确定该怎么做,或者这是否疯狂。

如有任何建议,我们将不胜感激。

最佳答案

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

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

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

关于c++ - CMake 从公共(public)源代码树生成多个项目的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35808823/

相关文章:

ios - 前缀 header 的 Xcode 路径 - 新目标

c++ - "extern __forceinline "是什么 C++ 习语?

c++ - 禁用某些方法的 Visual C++ 虚函数覆盖警告

objective-c - 仪器中出现奇怪的内存泄漏

c++ - 从 session 0 中升级程序

c++ - Linux 下的 C C++ 图形程序

c++ - 在析构函数中正确使用 std::uncaught_exception

java - 我怎样才能简化这个奇数代码?

visual-c++ - 检测 EXCEPTION_FLT_STACK_CHECK 的原因

c++ - Gnuplot - 每秒更新图表