静态和动态库创建:如何?

Static & Dynamic Library Creation: How to?

所以我为基于二叉树的数据结构制作了一些 C++ 头文件,例如 AVL、Red-blacks、Tries 等,我想创建一个 .lib 文件,我可以随时在更大的项目中使用我想。我写的代码都是面向对象和模板化的。问题是,我只有很多头文件(我将函数包含在头文件中,因为我使用了模板,并且我想要最大程度的模块化)而没有源文件。我试图在 Visual C++ 中创建一个新的 .lib 项目,但它不会生成任何没有源文件的 .lib 文件,如果没有我不愿意做出的妥协,我就无法创建这些文件。我看不到这个问题的任何解决方案,所以我可以就如何继续进行提供一些意见吗?谢谢!

如果您创建了一个库,其源代码完全由 C++ 头文件组成 文件,也就是我们所说的 header-only 库 。您无需再做任何事情。

Header-only C++ 库正常。许多 Boost libraries 是 header-only。传统上已知的标准 C++ 库的子集 因为 Standard Template Library 传统上是 header-only。当库界面包含 完全是模板,当你有 编写头文件,在这种情况下,头文件 库。1

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

  • 你告诉你的编译器在哪里可以找到头文件 include-directories 选项或 IDE

  • 中的等效项目设置
  • #include 需要的头文件。

仅此而已。

初学 MS Visual Studio 可能给您留下了初步印象 图书馆 必须有 一个 .lib 文件,但不清楚为什么会这样。 在 MS Windows 世界中,当库是常规库时就是如此 - 不是 C++ header-only 库。 (相应的事情在 Linux 和其他操作系统,除了它们有其他东西而不是 .lib 文件)。 传统的 C 或 C++ 库是从定义其接口的头文件和单独的源文件构建的, 定义它的实现。构建库需要编译 每个源文件转换为包含部分库实现的目标文件, 然后将所有这些目标文件以某种形式打包在一起——一个动态的 库或静态库 - 包含 整个 实现。

所以要重用一个传统的库,我需要它的头文件,这样我 可以在我的源代码中正确调用它的接口;我需要 object-file 包含其二进制实现的库包,这样我 可以告诉 linker link my 目标文件和那个包 并生成完整的工作程序。图书馆的 .lib 文件代表 linker 的目标文件包(虽然 代表 意味着一件事 对于静态库和 DLL 完全不同的东西)。

对于 header-only 库,根据定义没有单独的源 定义部分实现的文件。因此没有单独的目标文件。 因此没有单独的目标文件包。没有.lib。没有 link 年龄。没有什么可 被 link 编辑。


[1] 专门提供 template 接口的库可能很好 实现 专门使用模板,只包含 其接口的模板实现,在其头文件中。但没什么 阻止实施者编写实施的内​​部部分 使用 non-template 代码,如果他们看到这样做有一些决定性优势 - 大小优化, 也许?在那种情况下,他们没有得到 header-only 库,即使接口 都是模板。在没有反补贴考虑的情况下,自然 模板接口的实现是一个模板实现,并且 header-only 图书馆是自然产物。