C ++库组织

时间:2013-08-04 18:12:47

标签: c++ cmake static-libraries organization

我正在建立一个非常基础的图书馆,它是我计划发布的第一个项目,供其他人使用,如果他们愿意的话。因此,我想知道一些"最佳做法"就组织而言。关于我的项目唯一可能独特的是,为了在项目中使用它,用户将被要求扩展某些抽象类,这引出了我的第一个问题:

  • 我见过的很多图书馆都包含.a文件和单个.h文件。这是最佳做法吗?不公开所有公共.h文件以便用户可以选择要包含哪些文件?如果这是首选的做事方式,它究竟是如何完成的?什么是单个.h文件?

我的第二个问题涉及依赖性。例如,我当前的项目依赖于OpenGL,GLFW和GLEW。 我应该以某种方式将这些内容打包到我的项目中,还是让用户负责确保安装它们?

编辑:有人询问我的目标操作系统。我所有的依赖都是跨平台的,所以我(也许是天真的)希望能让我的库跨平台。

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

这实际上取决于具体情况。如果你有一些相当复杂的功能,那就是许多密切相关的功能,那么一个头是正确的解决方案。

E.g。你编写了一组向屏幕绘制内容的函数,你需要一些函数来配置/设置环境,一些函数来定义和放置场景中的对象,一些函数来进行实际的绘制/处理,最后拆机,然后使用一个头文件是一个很好的计划。

在上述情况下,还可以有一个“整体”头文件,其中包含几个较小的头文件。特别是如果你有相当大的类,将它们全部放在一个文件中会变得很混乱。

另一方面,如果你有一套处理溶解在液体中的气体的功能,另一组用于计算钢梁强度/负载能力的功能,另一组功能用于计算钢梁的摩擦力橡胶轮胎对着路面,那么它们可能应该有不同的标题 - 即使它是所有可行的功能进入“物理/力学库”。

向你的图书馆提供第三方图书馆是一个不错的主意 - 是的,如果你想提供两次下载,一次是“你只需要加水”,还有一个“裸库”,这很好。但是我不想花三倍的时间来下载你的库,只是因为它还包含你的代码正在使用的其他三个库,这些库已经在我的机器上了。但是,请记录需要哪些库,以及在支持的平台上安装它们需要做什么(以及支持的平台是什么)。您测试过哪些版本的库 - 没有什么比“获取最新版本”更糟糕的了,只是发现需要的版本需要两步......

(正如Jason C指出的那样,一旦你的代码依赖于一些不同的软件包,许可就变得非常混乱,因为你的许可证必须与所有其他许可证兼容 - 有时候甚至不可能...... )

答案 1 :(得分:1)

您有选择权,这实际上取决于您为使用您的库的开发人员选择的方式。

对于标题,平均复杂性库的一般方法是使用一个开发人员可以包含的标题来获取他们需要的所有内容。一个好的方法是,如果你有多个标题,创建一个与你的库同名的单个标题(不是必需的,只是常见的)并让#include所有单独的标题。然后分发单个标头和单个标头。这样,您的用户可以选择#include只有一个来获取所有内容,或者#including个别内容(如果有必要)。

E.g。在mylibrary.h中:

#ifndef MYLIBRARY_H
#define MYLIBRARY_H

#include <mylibrary/something.h>
#include <mylibrary/another.h>
#include <mylibrary/lastone.h>

#endif

如果您想为开发人员提供该选项,请确保您的各个标题可以单独包含(即#include包含他们需要的所有内容)。

对于依赖项,您需要让用户负责确保它们已安装。用户正在编译他们的代码并链接到您的库,因此用户也有责任链接到依赖库。如果您将第三方依赖项打包到库中,则会遇到很多风险:

  1. 打破已安装依赖项的用户系统。
  2. 正如Mats Petersson的回答所述,强迫用户下载已有的依赖项。
  3. 违反第三方库的许可权。
  4. 您要做的最好的事情是清楚地记录所需的依赖关系。

    为此,没有真正标准的“最佳实践”。任何理智的做法都是一种很好的做法。