每个程序是否都包含已编译的 .exe 或 java 文件中的库副本?
那些应该在每台计算机上的库,比如 opengl.dll 等呢?
每个程序是否都包含已编译的 .exe 或 java 文件中的库副本?
那些应该在每台计算机上的库,比如 opengl.dll 等呢?
程序的编译方式和链接方式(库是静态链接还是动态链接)是两个独立的问题。我将针对 C 系列语言讨论这个问题。
使用包含数据类型(结构)和函数(原型)声明的头文件针对外部库编译程序。编译器可以使用这些声明来发出对尊重平台应用程序二进制接口 (ABI) 的外部库的调用,该接口指定结构布局、调用约定、名称修改等——程序和库必须就通信达成一致。编译完成后,编译器会发出一个目标文件,其中包含对库函数的外部调用。
在链接时,库可以是静态链接的,这意味着库代码的副本被集成到可执行文件中(如果使用链接时优化,可以执行进一步的优化)。否则程序运行时会动态链接库;动态链接器使用可执行头文件中的重定位信息来修补对库的调用,其中包含链接器加载外部库的地址。
动态链接依赖于在运行时可用的库,但具有允许独立于程序更新库(例如用于安全修复)的优点,只要它公开相同的函数和数据类型。动态链接也可以延迟到程序实际调用库中的函数,从而使程序启动得更快。