gpt4 book ai didi

c++ - 在中型项目中 CMake 的最佳方式是什么?

转载 作者:太空宇宙 更新时间:2023-11-04 10:39:56 25 4
gpt4 key购买 nike

在我的公司,我们正在开发一个中型项目,我们计划使用 CMake 作为构建平台生成器。在这种情况下,我和我的同事正在讨论应该以何种方式使用 CMake。我们的讨论到了一个转折点,我们必须决定使用的方法。我们的目录结构类似于这样:

<"our project"> \
modules \
module_1 \
tests \
test_example.cpp
mock
some_mock_class.hpp
some_class.hpp
some_class.cpp
...
module_2 \
...
module_3 \
...
utility \
...

1- 首先,我的同事认为像“src”和“includes”这样的文件夹是对 C 编程的提醒,在现代 C++ 程序中没有位置,所以我们不需要它们。所以我们从结构中删除了它们,但作为一个 Linux 人;我不确定这是否是个好主意。我们是否应该为 header 设置一个“include”目录,以便 CMake 可以将它们适本地安装到安装目标的 include 目录中;或者 CMake 可以适本地处理它们吗?

2- 我们应该为包含并定义所有目标的项目的根创建一个 CMakeLists.txt,还是应该为每个模块创建一个 CMakeLists.txt,然后使用“add_subdirectory”指令来包含它们?我的同事认为 CMakeLists.txt 是最好的,因为这样模块实现者根本不需要考虑 CMake,一两个部署管理员可以维护文件;但我认为每个模块实现者都更清楚他们使用哪些库,以及如何编译他们的模块——他不同意这一点。在这种情况下,您有什么建议?

如果您之前(或知道一个案例)在这样的中型项目中使用过 CMake,能否请您向我们推荐他们做了什么,如果可能的话,为什么?

真诚的

最佳答案

题目很大,但总之是个人推荐。对于一个中间项目,我认为应该已经应用了一个组件模型。那么合理的是,让组件目录及其 onwn CMakeLists.txt 被顶级 CMakeLists.txt 通过 add_subdirectory() 引用。每个组件 - 一个单独的库(我喜欢静态的)。

对于组件文件夹,我发现将所有内部内容(也称为实现和私有(private) header 等)隐藏在 private 子目录下是合理的,以免暴露给外部。然后,在顶级组件目录中,您只有供其他人使用的 header 。在私有(private)目录中,您可以混合源代码和标题 - 这只是中期项目的口味问题。如果组件很大,也可以分解私有(private)目录。但是随后您需要决定是将所有工件添加到组件的单个 CMakeLists.txt 中,还是拥有子库。但在那种情况下,用户应该单独链接到它们,而不是仅链接到组件的库。

在最好的情况下,文件夹结构应该遵循依赖关系结构并形成一个 TreeView 构建系统,其中组件对其他组件的内部知识尽可能少。在这种情况下,您将拥有良好的可配置性和灵 active ,以应对可能的重构。换句话说,构建系统的设计在我看来类似于 C++ 中的类设计 - 相同的原则。

运行 cmake 的真实(目标)构建目录可以位于任何地方,通常在源目录之外。如果你有足够的内存,它可能是一个 RAM 光盘的好地方。然后对于干净的构建,您只需要删除它,就是这样。但是源代码和构建本身与其位置没有依赖关系。

啊,是的,还有一个提示。我的建议是通过从组件目录开始的路径包含 header ,例如位于 ComponentX/SomeHeader.hpp 的 #include "SomeHeader.hpp"。然后 CMakelists.txt 用于执行组件已知的 ComponentX 目录。这意味着, header 的路径未在源文件中进行硬编码。这带来了一些限制,例如唯一的文件名,但可以更轻松地更改组件位置。

希望这对您有所帮助。

关于c++ - 在中型项目中 CMake 的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35572674/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com