提问人:tomeadom 提问时间:10/1/2023 更新时间:10/1/2023 访问量:122
c++ 中动态链接的真正目的是什么?
What is a real purpose of dynamic linking in c++?
问:
我是新手,不明白为什么我应该在有.dynamic linking
static linking
- 我知道这会减小程序文件的大小,但如果是 ,它仍然必须包含在安装程序中。因此,应用文件夹的最终大小不会改变。
dynamic linking
custom dynamic library
- 如果机器上已经安装了外部库,如何在项目设置(vs、cmake、qmake)中确定和指定其位置。在此期间,您可以通过系统调用或 Windows 注册表找到位置。但是在期间如何做呢?
dynamic loading
dynamic linking
请帮帮我,因为这两点我完全不明白为什么需要(我能理解需要)。dynamic linking
dynamic loading
答:
动态链接不仅可以减小最终可执行文件的文件大小,还可以改善应用程序的内存占用。如果有两个应用程序,这两个应用程序都是静态链接的,并且都使用一个公共的共享库,那么同一共享库的两个副本将驻留在内存中,这是一种浪费。一般来说,您总是希望动态链接能够生成最小、最有效的代码。
那么什么时候适合使用静态链接呢?如果您不确定目标计算机的操作系统版本,静态链接您的应用程序可以确保您的应用程序无论其版本如何都能运行。此外,安全应用程序(如金融应用程序)也是一个很好的候选者,因为它通过为每个进程提供独立的环境来隔离一个进程与另一个进程,并且任何应用程序之间都不会共享任何代码。此外,静态链接提供了更快的执行速度,因为我们在编译时复制了整个库内容。因此,我们不必在运行时运行对未解析符号的查询。因此,我们可以比动态链接的程序更快地执行静态链接程序。
评论
-L
LIBRARY_PATH
LD_LIBRARY_PATH
我是新手,不明白为什么我应该在有.
dynamic linking
static linking
请注意,静态库和(因此)静态链接是更传统的方法。共享库和动态链接被设计出来并变得非常流行,主要原因有几个:
- 与静态链接库相比,减少了应用程序的存储大小
- 与静态链接库相比,减少了应用程序的内存占用
- 能够修复错误并对所有应用程序进行一次改进
此外
一些共享对象系统将整个应用程序设置为共享对象,这将内存占用优势扩展到同时运行多个应用程序实例的情况。
一些共享库系统还提供特定于共享库的附加功能(动态加载、弱符号等)。
静态库的主要优点主要围绕控制:
- 如果应用程序不希望依赖主机系统来提供特定的共享库,或者
- 如果应用程序出于兼容性或安全性目的想要控制库代码的特定版本
然后,静态链接库代码可以解决这些问题。
- 我知道这会减小程序文件的大小,但如果是 ,它仍然必须 包含在安装程序中。因此,应用程序文件夹的最终大小 不会改变。
dynamic linking
custom dynamic library
或。但是,如果您的项目根据库提供了多个可执行文件,该怎么办?这种情况并不少见,在这种情况下,使库成为动态链接的库确实可以节省持久性存储设备上的空间。
即使你只有一个可执行文件,让它使用共享库和/或成为共享对象本身也会减少同时运行多个实例所需的内存量。
无论如何,如果您专注于自己提供的自定义库,那么您应该根据您最初构建库的原因来评估是将其构建为动态库还是静态库。例如,如果这纯粹是为了方便构建单个可执行文件的构建,那么它可能应该是一个静态库——但您可能仍然希望整个可执行文件是一个动态对象。
另一方面,如果多个可执行文件将链接该库,特别是如果您打算将其公开供第三方应用程序使用,那么您可能应该提供它的共享库版本。您也可以选择提供静态库版本。
- 如果机器上已经安装了外部库,如何在项目设置(vs、cmake、qmake)中确定和指定其位置。在此期间,您可以通过系统调用或 Windows 注册表找到位置。但是在期间如何做呢?
dynamic loading
dynamic linking
如果它安装在链接器默认搜索的位置之一,则无需手动查找它。如果不是,那么动态链接库的链接时间问题与静态链接库的链接时间问题没有什么不同。当您遇到该问题时,如何解决它的详细信息取决于操作系统和构建框架。例如,如果您使用的是 CMake,那么共享库发行版可以通过提供用于确定库和标头位置以及其他详细信息的 CMake 宏来为此提供(许多共享库都这样做)。
无论如何,构建细节是相对较少的人必须整理的东西,很少。本答案开头讨论的操作利弊规模要大得多。
当然,以上所有假设您都有选择。并非所有系统都提供。
评论
LoadLibrary