我一直在寻找和阅读一段时间,但仍然无法得到干净的答案:
运行时库和动态库之间有什么区别?
具体来说,我想知道以下几个方面:
运行时库如何在构建过程中工作?
为什么称它为“运行时”?它总是被加载到内存中吗?
答案 0 :(得分:2)
根据可执行文件访问它们的方式,通常有三种类型的库:
静态库往往在构建时链接到可执行文件,通常是通过链接器。因此,可执行文件永远“卡住”这些库。
动态库是“后期绑定”,它们往往在代码运行或即将运行时链接到您的可执行文件。这就是运行时意味着什么,在运行时完成的事情,与编译时静态链接形成对比)。
自动加载的一个由操作系统(加载器)处理,您无需在代码中执行任何特定操作。在构建时,您已经指定了可执行文件加载时所需的库,但这些库与您的可执行文件的实际链接会在稍后发生。
这意味着您可以替换库以影响可执行文件的工作方式,不用重新链接可执行文件(与静态链接不同)。
手动动态库是您通过代码显式加载库的方式,例如dlopen
(打开库)和dlsym
(以获取符号中的符号地址)库)。
您可能还想看一下静态/动态区别的this answer。
这涵盖了您可能会遇到的库的类型,但就您在评论中提供的链接而言,这里提到的“运行时库”似乎只是提供某些语言功能的库。
例如,C运行时库是一个库,包含用于打开文件的fopen()
或用于复制字符串的strcpy()
。虽然编译器理解核心语言(if
,while
等,包括如何调用函数),非核心语言功能作为包含可以调用的函数的库提供。
从这个意义上讲,要求动态库和运行时库之间的区别是不协调的,因为它们指的是不同的概念。运行时库可以作为静态或动态提供。