【问题标题】:What is the need for a library in C++?C++ 中的库需要什么?
【发布时间】:2021-07-18 07:39:51
【问题描述】:

头文件只包含函数的声明,函数的实际实现在库中。如果他们不想共享源代码,他们可以共享 obj 文件。 当一个函数的实现也可以在另一个 C++ 文件中完成时,我们为什么要使用库?

【问题讨论】:

  • 库或多或少只是 .obj 文件的集合。例如,标准 C 库可能由 50 个左右的 .obj 文件组成。分发一个库比分发 50 个 .obj 文件要简单得多。
  • 库是对象文件的集合。最初,库文件只是归档的目标文件。因此,静态库是通过调用ar 构建的。后来,共享对象 (.so) 被引入,它提供了延迟链接和节省磁盘空间等优点。
  • 您愿意 a) 将每个库的单个选项传递给链接器,还是 b) 将 300 个 .o 文件传递​​给链接器。如果您选择选项 b,每次库供应商重写代码时,您会如何调整此链接器调用,例如添加一个辅助类并删除一些不再使用的类。此外,如果您需要类似插件的功能,则可以在运行时动态加载共享库;不确定这是否可以通过对象库实现,即使它发生战争,也必须列出所有正确的 .o 文件。

标签: c++ dll linker lib


【解决方案1】:

通常,一个库是多个翻译单元的集合。库存档只是一种将单独的目标文件捆绑到一个 blob 中的便捷方式。

除此之外,共享库还增加了在多个依赖项之间动态加载和共享常用库的能力,这对于普通对象文件是不可能的。

【讨论】:

    【解决方案2】:

    库通常用作其他开发人员实现的函数集合,并且可以被其他开发人员“作为一般使用”使用,还可以最大程度地减少代码,并且您可以从库中获取函数并编辑实现根据您的需要。

    【讨论】:

      【解决方案3】:

      正如其他人解释的那样,我想在其中添加更多内容,库为您提供跨多个系统的可重用性,无论它们是用哪种语言编写的不同语言,除非它遵循相同的 ABI。例如,用 C 语言编写的库可以很容易地与 Rust 一起使用,方法是用 Rust 语法包装相同的函数。

      例如,C 中的函数具有此签名。

      int return_num(int a);
      

      如果我们用 Rust 编写,它的交互方式与 C 相同。

      extern "C" {
          fn return_num(x: i32) -> i32;
      }
      

      【讨论】:

        猜你喜欢
        • 2012-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-03
        相关资源
        最近更新 更多