运行时依赖项和生成依赖项概念

Runtime dependency and build dependency concepts

本文关键字:依赖 运行时      更新时间:2023-10-16

我一直听说过构建依赖/运行时依赖。它们是不言自明的术语。据我了解,构建依赖项用于编译时所需的组件。例如,如果 A 与 B 具有生成依赖关系,则 A 无法在没有 B 的情况下生成。如果 A 与 B 具有运行时依赖关系,则可以在没有 B 的情况下构建 A,但在没有 B 的情况下无法运行。
然而,这些信息太浅了。我想更好地阅读和理解这些概念。我一直在谷歌搜索,但找不到来源,你能给我一个链接或正确的关键字来搜索吗?

我将尽量保持简单和理论性。

当你编写调用函数"func

"的代码时,编译器需要你的函数描述符(例如"int func(char c);",通常在.h文件中可用)来验证参数的正确性,链接器需要你的函数实现(你的实际代码所在的位置)。

操作系统提供了将函数实现分离到不同编译模块中的机制。通常需要

  1. 更好的代码重用(多个应用程序可以使用相同的代码,具有不同的数据上下文)
  2. 更高效的编译(不需要重新编译所有依赖项库)
  3. 部分升级
  4. 分发已编译的库,而不公开源代码

为了支持这样的功能,编译器像往常一样提供了函数描述符(.h文件)。虽然链接器提供了包含函数存根的库文件。操作系统负责在应用程序加载过程中加载实际的实现文件(如果尚未为不同的应用程序加载),并将实际函数映射到新应用程序的内存中。

动态加载功能也扩展到面向对象的语言(C++,C#,Java等)

实际实现取决于操作系统 - 动态链接在Windows中实现为DLL文件或在Linux中实现为SO文件

特殊的操作系统相关技术可用于在使用相同动态库的不同应用程序之间共享上下文(变量、对象)。

梅厄·策特林