静态&动态图书馆创建:如何?

时间:2017-02-04 22:00:44

标签: c++ shared-libraries static-libraries

所以我为基于二叉树的数据结构制作了一些C ++头文件,比如AVL,Red-blacks,Tries等。我想创建一个.lib文件,我可以随时在更大的项目中使用它。 。我写的代码都是面向对象和模板化的。问题是,我所拥有的是很多头文件(我在头文件中包含了函数,因为我使用了模板,我想要最大的模块化)并且没有源文件。我试图在Visual C ++中创建一个新的.lib项目,但是它没有生成没有源文件的任何.lib文件,我不能在没有妥协的情况下创建我不愿意做的。我没有看到这个问题的任何解决方案,所以我可以得到一些关于我如何进行的输入?谢谢!

1 个答案:

答案 0 :(得分:2)

如果您创建了一个源代码完全由C ++标头组成的库 文件,我们称之为仅限标头的库。你不需要做任何事情。

仅限标头的C ++库是正常的。许多Boost libraries 仅限标题。传统上已知的标准C ++库的子集 因为Standard Template Library传统上只是标题。当库接口包含时 完全是模板,很可能在你拥有时完成 编写头文件,在这种情况下头文件 库。 1

您希望您的模板库可以在其他项目中重复使用吗?它已经 是。要重复使用它: -

  • 您告诉编译器使用它来查找头文件的位置 include-directories 选项或IDE中的等效项目设置

  • 根据需要#include头文件。

这就是它的全部内容。

在MS Visual Studio上切割牙齿可能会给您留下早期印象 库必须一个.lib文件而不清楚为什么会这样。 在MS Windows世界中,当库是传统库时,情况就是如此 - 不是C ++标头库。 (在Linux中也是如此 和其他操作系统,除了他们有其他东西而不是.lib文件)。 传统的C或C ++库是从头文件构建的,它定义了它的接口和单独的源文件, 定义其实现。构建库需要编译 将每个源文件放入一个包含部分库实现的目标文件中, 然后以某种形式将所有这些目标文件打包在一起 - 一个动态的 库或静态库 - 包含整个实现。

因此,为了重用传统的库,我需要它的头文件,所以我 可以在我的源代码中正确调用其接口;我需要的 包含其二进制实现的object-file库包,以便我 可以告诉链接器将我的目标文件与该包一起链接 并生成一个完整的工作程序。库的.lib文件代表 目标文件包到链接器(虽然表示意味着一件事 对于静态库和DLL的完全不同的东西。)

对于仅标头库,根据定义,没有单独的源 定义部分实现的文件。因此没有单独的目标文件。 因此没有单独的目标文件包。没有.lib。没有联系。什么都没有 被联系起来。

<小时/> [1]可以提供专门提供模板接口的库 是实现专门用模板,只包括 其接口的模板实现,在其头文件中。但没什么 阻止实现者编写实现的内部部分 使用非模板代码,如果他们看到这样做的一些决定性优势 - 大小优化, 也许?在这种情况下,即使是接口,它们也不会获得仅限标头的库 都是模板。在没有反补贴考虑的情况下,自然而然 模板接口的实现是模板实现和 仅限标题的库是天然产品。