静态和动态库创建:如何?
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 图书馆是自然产物。
所以我为基于二叉树的数据结构制作了一些 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 图书馆是自然产物。