【问题标题】:Static & Dynamic Library Creation: How to?静态和动态库创建:如何?
【发布时间】:2017-02-04 22:00:44
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    • 你告诉你的编译器在哪里找到头文件使用它 include-directories 选项或 IDE 中的等效项目设置

    • #include 需要的头文件。

    仅此而已。

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

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

    对于仅标头库,根据定义,没有单独的源 定义部分实现的文件。因此没有单独的目标文件。 因此没有单独的目标文件包。没有.lib。没有联动。没有什么可做的 被链接。


    [1] 专门提供 template 接口的库可能会 仅使用模板实现,仅由模板组成 其接口的模板实现,在其头文件中。但什么都没有 阻止实现者编写实现的内部部分 对于非模板代码,如果他们看到这样做的一些决定性优势 - 大小优化, 也许?在这种情况下,即使接口 都是模板。在没有反补贴考虑的情况下,自然 模板接口的实现是一个模板实现和 仅标题库是自然产物。

    【讨论】:

    • 感谢您花时间撰写如此令人印象深刻的深度指南。真的帮了我!
    猜你喜欢
    • 2013-10-28
    • 2011-03-04
    • 1970-01-01
    • 2013-09-26
    • 1970-01-01
    • 2021-02-26
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    相关资源
    最近更新 更多