c++ - 如何部署 C 静态库:头文件 + c 文件或目标文件?
问题描述
我创建了一个带有一些功能的小型库。它有一个.h
文件和一个.c
文件。让我们说这是一个“你好世界”。我想把它放在我的 Github 上,让每个人都可以在他们的 C 或 C++ 代码中克隆和使用我的函数。我看到它有两种方式:
- 放出标题和功能代码,并
#include "library"
在他们的程序中告诉每个人。 - 把头文件(供参考)和目标文件拿出来
.o
,告诉大家在编译时自己链接。
我应该怎么做?创建 C/C++ 库的首选方式或标准是什么?
编辑:
后续问题:有没有一种方法可以在我的存储库中准备一个安装文件,以便用户安装我的库,然后可以将其包含在内,#include <library>
而无需将我的文件放在他的工作目录中?
解决方案
我将忽略有关“首选”的问题,因为这涉及到意见问题。不过,涵盖一些优点和缺点的争议较小。请不要假设此列表是详尽无遗的。
1)把标题和功能代码
#include "library"
放在他们的程序中告诉每个人。
由于这不是一个只有头文件的库,所以仅仅#include
头文件是不够的。其他人将需要#include
头文件并将您的源文件编译为他们项目的一部分。无论如何,这不是通常所说的“静态库”。但是,对于一个小到足以保证一个源文件的“库”来说可能就足够了。
2)把头(供参考)和目标文件拿出来
.o
,告诉大家自己编译时链接。
这种方法的两个部分都是有问题的。首先,标题不仅仅是为了提供信息;其他人需要#include
它,以便他们的编译器知道您的 API。其次,目标文件 ( .o
) 可以是特定于编译器的,因此这种方法仅对那些使用与您完全相同的构建环境的人有用。这可能会缩小范围,足以使这种方法的使用可以忽略不计。不过,请使用您自己的判断。
由于我们没有您的想法,让我们继续讨论其他一些想法。
3) 将您的代码编译为静态库(.a
在 Linux 上,.lib
在 Windows 上),然后分发头文件和库文件。其他人会#include
在他们的代码中使用头文件并链接到您的库。
这里需要注意的是,该库是特定于平台的。这比特定于编译器的限制更少,但它仍然可能意味着您需要针对不同平台发布多个版本。其他人也有一些责任将库文件复制到适当的目录。较新的程序员可能不知道哪些目录可能是合适的。
4) 提供头文件、源代码和makefile,使其他人能够自己编译和安装您的库。然后他们会#include
在他们的代码中使用头文件并链接到您的库。
这是对您的最终用户限制最少的方法,但它确实需要您提供一个好的 makefile 才能成功。这将带您进入 C 和 C++ 之外的编程世界(顺便说一下,不同的语言)。
对于其他项目,makefile 方法的一个潜在缺点是最终用户可能没有安装(受支持的)编译器。幸运的是,静态库开发人员可能会假设他们的最终用户拥有编译器。:)
请注意,Git 的目的是共享源代码。如果您认为 Github 是您的主要分发方法,那么您应该查看涉及分发源代码的选项。另一方面,您需要一个预编译选项,您应该考虑将 Github 以外的其他方式作为您的主要分发方法。
推荐阅读
- mysql - 在插入之前检查数据库中是否不存在数据。SQL、节点、快速服务器
- javascript - 如何根据AngularJs路由中的页面更改html元素或传递数据?
- c# - 将 ODBC 表绑定到 WPF DataGrid
- symfony - 如何防止 symfony 配置的规范化
- mysql - 每个项目的 MYSQL 插入
- sql-server - 将主键添加到表列(请参阅附图以获得更清晰的信息)
- python - Django:在另一个数据库中的相关模型字段上应用过滤器
- google-cloud-robotics - 谷歌云机器人中的 ROS2
- angular - 在 NgOnInit 中调用的模拟函数上的 Angular Spy
- angular - 使用 ng2-file-upload 异步上传文件