首页 > 解决方案 > 如何部署 C 静态库:头文件 + c 文件或目标文件?

问题描述

我创建了一个带有一些功能的小型库。它有一个.h文件和一个.c文件。让我们说这是一个“你好世界”。我想把它放在我的 Github 上,让每个人都可以在他们的 C 或 C++ 代码中克隆和使用我的函数。我看到它有两种方式:

  1. 放出标题和功能代码,并#include "library"在他们的程序中告诉每个人。
  2. 把头文件(供参考)和目标文件拿出来.o,告诉大家在编译时自己链接。

我应该怎么做?创建 C/C++ 库的首选方式或标准是什么?

编辑:

后续问题:有没有一种方法可以在我的存储库中准备一个安装文件,以便用户安装我的库,然后可以将其包含在内,#include <library>而无需将我的文件放在他的工作目录中?

标签: c++cstatic-librarieslibraries

解决方案


我将忽略有关“首选”的问题,因为这涉及到意见问题。不过,涵盖一些优点和缺点的争议较小。请不要假设此列表是详尽无遗的。

1)把标题和功能代码#include "library"放在他们的程序中告诉每个人。

由于这不是一个只有头文件的库,所以仅仅#include头文件是不够的。其他人将需要#include头文件并将您的源文件编译为他们项目的一部分。无论如何,这不是通常所说的“静态库”。但是,对于一个小到足以保证一个源文件的“库”来说可能就足够了。

2)把头(供参考)和目标文件拿出来.o,告诉大家自己编译时链接。

这种方法的两个部分都是有问题的。首先,标题不仅仅是为了提供信息;其他人需要#include它,以便他们的编译器知道您的 API。其次,目标文件 ( .o) 可以是特定于编译器的,因此这种方法仅对那些使用与您完全相同的构建环境的人有用。这可能会缩小范围,足以使这种方法的使用可以忽略不计。不过,请使用您自己的判断。

由于我们没有您的想法,让我们继续讨论其他一些想法。

3) 将您的代码编译为静态库.a在 Linux 上,.lib在 Windows 上),然后分发头文件和库文件。其他人会#include在他们的代码中使用头文件并链接到您的库。

这里需要注意的是,该库是特定于平台的。这比特定于编译器的限制更少,但它仍然可能意味着您需要针对不同平台发布多个版本。其他人也有一些责任将库文件复制到适当的目录。较新的程序员可能不知道哪些目录可能是合适的。

4) 提供头文件、源代码和,使其他人能够自己编译和安装您的库。然后他们会#include在他们的代码中使用头文件并链接到您的库。

这是对您的最终用户限制最少的方法,但它确实需要您提供一个好的 makefile 才能成功。这将带您进入 C 和 C++ 之外的编程世界(顺便说一下,不同的语言)。

对于其他项目,makefile 方法的一个潜在缺点是最终用户可能没有安装(受支持的)编译器。幸运的是,静态库开发人员可能会假设他们的最终用户拥有编译器。:)

请注意,Git 的目的是共享源代码。如果您认为 Github 是您的主要分发方法,那么您应该查看涉及分发源代码的选项。另一方面,您需要一个预编译选项,您应该考虑将 Github 以外的其他方式作为您的主要分发方法。


推荐阅读