所以我为基于二叉树的数据结构制作了一些C ++头文件,比如AVL,Red-blacks,Tries等。我想创建一个.lib文件,我可以随时在更大的项目中使用它。 。我写的代码都是面向对象和模板化的。问题是,我所拥有的是很多头文件(我在头文件中包含了函数,因为我使用了模板,我想要最大的模块化)并且没有源文件。我试图在Visual C ++中创建一个新的.lib项目,但是它没有生成没有源文件的任何.lib文件,我不能在没有妥协的情况下创建我不愿意做的。我没有看到这个问题的任何解决方案,所以我可以得到一些关于我如何进行的输入?谢谢!
答案 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]可以提供专门提供模板接口的库 是实现专门用模板,只包括 其接口的模板实现,在其头文件中。但没什么 阻止实现者编写实现的内部部分 使用非模板代码,如果他们看到这样做的一些决定性优势 - 大小优化, 也许?在这种情况下,即使是接口,它们也不会获得仅限标头的库 都是模板。在没有反补贴考虑的情况下,自然而然 模板接口的实现是模板实现和 仅限标题的库是天然产品。