如何部署C静态库:header + c文件或object文件?
How to deploy a C static library: header + c file or object file?
我创建了一个带有一些功能的小型库。它有一个 .h
文件和一个 .c
文件。假设它是 'hello world'。我想把它放在我的 Github 上,让每个人都可以在他们的 C 或 C++ 代码中克隆和使用我的函数。我有两种看法:
- 把header和函数代码放出来告诉大家在自己的程序里
#include "library"
- 拿出 header(供参考)和 object 文件
.o
并告诉大家在自己编译期间 link 它。
我该怎么办?创建 C/C++ 库的首选方法或标准是什么?
编辑:
跟进问题:有没有一种方法可以在我的存储库中准备一个安装文件,这样用户就可以安装我的库,以后可以将其作为 #include <library>
包含进来,而无需将我的文件放入他的工作中目录?
我将忽略有关 "preferred" 的问题,因为它深入探讨了意见问题。不过,涵盖一些优点和缺点的争议较小。请不要假设此列表是详尽无遗的。
1) Put out the header and the functions code and tell everyone to #include "library"
in their programs.
由于这不是 header-only 库,因此仅 #include
header 文件是不够的。其他人需要 #include
header 文件 和 编译您的源文件作为他们项目的一部分。无论如何,这不是 "static library" 通常的意思。但是,对于足够小的 "library" 只需要一个源文件就足够了。
2) Put out the header (for information) and the object file .o
and tell everyone to link it during compilation themselves.
这种方法的两个部分都有问题。首先,header 不仅仅是为了提供信息;其他人需要 #include
它以便他们的编译器知道你的 API。其次,object 个文件 (.o
) 可以是 compiler-specific,因此这种方法仅对那些使用与您完全相同的构建环境的人有用。这可能会缩小范围,使这种方法的使用可以忽略不计。不过,请使用您自己的判断。
既然我们没有你的想法,让我们继续看其他的。
3) 将代码编译为静态库(.a
on Linux, .lib
on Windows), 然后分发 header 文件和库文件。其他人会 #include
他们代码中的 header 文件和 link 针对您的库。
这里需要注意的是图书馆是 platform-specific。这比 compiler-specific 限制更少,但它仍然可能意味着您需要针对不同平台发布多个版本。其他人也有责任将库文件复制到适当的目录。新手程序员可能不知道哪些目录是合适的。
4) 拿出 header 文件、源代码和一个 makefile 可以让其他人编译和为自己安装你的图书馆。然后他们会 #include
他们的代码中的 header 文件和 link 针对你的图书馆。
这是对您的最终用户限制最少的方法,但它确实需要您提供良好的 makefile 才能成功。这将带您进入 C 和 C++(顺便说一句,不同的语言)之外的编程世界。
对于其他项目,makefile 方法的一个潜在缺点是最终用户可能没有安装(支持的)编译器。幸运的是,静态库开发人员可能会假设他们的最终用户拥有编译器。 :)
注意Git的重点是分享源码。如果您认为 Github 是您的 主要 分发方法,那么您应该查看涉及分发源代码的选项。另一方面,您需要一个 pre-compiled 选项,您应该考虑将 Github 以外的其他东西作为您的主要分发方法。
我创建了一个带有一些功能的小型库。它有一个 .h
文件和一个 .c
文件。假设它是 'hello world'。我想把它放在我的 Github 上,让每个人都可以在他们的 C 或 C++ 代码中克隆和使用我的函数。我有两种看法:
- 把header和函数代码放出来告诉大家在自己的程序里
#include "library"
- 拿出 header(供参考)和 object 文件
.o
并告诉大家在自己编译期间 link 它。
我该怎么办?创建 C/C++ 库的首选方法或标准是什么?
编辑:
跟进问题:有没有一种方法可以在我的存储库中准备一个安装文件,这样用户就可以安装我的库,以后可以将其作为 #include <library>
包含进来,而无需将我的文件放入他的工作中目录?
我将忽略有关 "preferred" 的问题,因为它深入探讨了意见问题。不过,涵盖一些优点和缺点的争议较小。请不要假设此列表是详尽无遗的。
1) Put out the header and the functions code and tell everyone to
#include "library"
in their programs.
由于这不是 header-only 库,因此仅 #include
header 文件是不够的。其他人需要 #include
header 文件 和 编译您的源文件作为他们项目的一部分。无论如何,这不是 "static library" 通常的意思。但是,对于足够小的 "library" 只需要一个源文件就足够了。
2) Put out the header (for information) and the object file
.o
and tell everyone to link it during compilation themselves.
这种方法的两个部分都有问题。首先,header 不仅仅是为了提供信息;其他人需要 #include
它以便他们的编译器知道你的 API。其次,object 个文件 (.o
) 可以是 compiler-specific,因此这种方法仅对那些使用与您完全相同的构建环境的人有用。这可能会缩小范围,使这种方法的使用可以忽略不计。不过,请使用您自己的判断。
既然我们没有你的想法,让我们继续看其他的。
3) 将代码编译为静态库(.a
on Linux, .lib
on Windows), 然后分发 header 文件和库文件。其他人会 #include
他们代码中的 header 文件和 link 针对您的库。
这里需要注意的是图书馆是 platform-specific。这比 compiler-specific 限制更少,但它仍然可能意味着您需要针对不同平台发布多个版本。其他人也有责任将库文件复制到适当的目录。新手程序员可能不知道哪些目录是合适的。
4) 拿出 header 文件、源代码和一个 makefile 可以让其他人编译和为自己安装你的图书馆。然后他们会 #include
他们的代码中的 header 文件和 link 针对你的图书馆。
这是对您的最终用户限制最少的方法,但它确实需要您提供良好的 makefile 才能成功。这将带您进入 C 和 C++(顺便说一句,不同的语言)之外的编程世界。
对于其他项目,makefile 方法的一个潜在缺点是最终用户可能没有安装(支持的)编译器。幸运的是,静态库开发人员可能会假设他们的最终用户拥有编译器。 :)
注意Git的重点是分享源码。如果您认为 Github 是您的 主要 分发方法,那么您应该查看涉及分发源代码的选项。另一方面,您需要一个 pre-compiled 选项,您应该考虑将 Github 以外的其他东西作为您的主要分发方法。