【问题标题】:What is a good structure for module Integration through Cmake通过Cmake进行模块集成的好结构是什么
【发布时间】:2013-05-08 14:19:21
【问题描述】:

我正在尝试整合我们通过 CMake 制作的几个不同项目。总的来说,项目的布局并不统一,但有一些相似之处。对于每个库,该库通常都有我想要维护的测试代码/可执行文件……而且它们也可以有自己的相互依赖关系。此外,这些库一直在单独的存储库中进行维护(如果有所作为,则为善变)。文件的相互依赖是这样的:

  • 库 A 是独立的
  • 库 B 是独立的
  • 库 C 是独立的
  • 库 E 依赖于 A、B、C
  • 可执行文件 1 取决于 C
  • 可执行文件 2 取决于 E
  • 可执行文件 3 取决于 E

所以每个库一般都是这样布局的

+ LibraryA\
| + CMakeLists.txt
| + LibraryA
| | + CMakeLists.txt
| | + Include\
| | | header.h
| | + Source\
| | | lib.cpp
| + Test\
| | + CMakeLists.txt
| | main.cpp

而且总体结构是

+ Root\
| + CMakeLists.txt
| + LibraryA\
| + LibraryB\
| + LibraryC\
| + LibraryE\
| + Executable1\
| + Executable2\
| + Executable3\

每个文件夹都是它自己的子目录项目。这种结构对 cmake 有意义吗?你如何维护这些项目之间的依赖关系? (如果我更改 A,可执行文件 3 应该重建)?

【问题讨论】:

  • 你可能想看看my previous answer
  • @Haroogan 那么在 CMakeLists 的“项目”声明中包含父项目会产生依赖关系吗? 'project(B A CXX)' 表示 A 依赖于 B(不在文档中)?如果我们不想让 B 知道 A,有什么办法可以做到这一点?
  • 不,您被库的简称弄糊涂了,即ABCproject 的最后两个参数是语言 CCXX,将用于此项目,因此 project(B A CXX) 是非法的。 project 与依赖无关,它只是设置项目的名称(第一个参数)和语言(最后两个参数)。我建议您先熟悉 CMake 并阅读文档,然后再执行为大型多组件项目设计结构等具有挑战性的任务。
  • @Haroogan 啊,我很困惑,这就是为什么我说“不在文档中”。我过去使用过 cmake。所以很清楚,设置依赖关系的事情是 CMake 足够聪明,知道 link_library 调用 B 指向与配置项目相同的名称,因此是构建的一部分而不是外部库?我仍然对不知道“幕后”究竟发生了什么感到不舒服。
  • 这需要编写类似FindB.cmake 模块的东西,该模块描述得很清楚here。在这种情况下,用户将像您知道的所有其他库(如 Boost、Qt 等)一样构建和安装一次 B,并且您的主项目将使用 FindB.cmake 来获得正确的 ${B_DEFINITIONS}${B_INCLUDE_DIRS} 和 @ 987654338@,指的是B的安装。我希望你明白了。

标签: cmake


【解决方案1】:

你想做什么是有道理的。你可以用 CMake 来做,即使如何做好它可能不是很明显。不久前我经历过同样的事情,并在这里写了一个关于它的问题,然后是一个概述我最终解决方案的答案:

CMake: how best to build multiple (optional) subprojects?

【讨论】:

    猜你喜欢
    • 2011-02-14
    • 2011-07-24
    • 2013-02-16
    • 1970-01-01
    • 2011-11-28
    • 2020-09-09
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    相关资源
    最近更新 更多