c++中动态链接的真实的目的是什么?

nkoocmlb  于 2023-10-16  发布在  其他
关注(0)|答案(2)|浏览(95)

我是新手,不明白为什么在有static linking的情况下还要使用dynamic linking
1.我知道dynamic linking减少了程序文件的大小,但如果它是custom dynamic library,它仍然必须包含在安装程序中。因此,应用程序文件夹的最终大小不会改变。
1.如果外部库已经安装在机器上,如何在项目设置(vs,cmake,qmake)中确定和指定其位置。在dynamic loading期间,您可以通过系统调用或Windows注册表找到位置。但是在dynamic linking期间如何做到这一点?
请帮助我,因为这两点,我不明白为什么dynamic linking是必要的(我可以理解的dynamic loading的需要)。

o7jaxewo

o7jaxewo1#

我是新手,不明白为什么在有static linking的情况下还要使用dynamic linking
请注意,静态库和(因此)静态链接是更传统的方法。共享库和动态链接被设计出来,并由于以下几个主要原因而变得非常流行:
1.相对于静态链接库,应用程序的存储大小减少
1.相对于静态链接库,减少了应用程序的内存占用
1.能够一次修复所有应用程序的错误并进行改进
此外,本发明还
1.某些共享对象系统将整个应用程序提供为共享对象,这将存储器占用优势扩展到应用程序的多个示例同时运行的情况。
1.某些共享库系统还提供专用于共享库的附加特征(动态加载、弱符号 * 等 *)。
静态库的主要优点主要围绕控制:

  • 如果应用程序不想依赖于主机系统来提供特定的共享库,或者
  • 如果应用程序希望出于兼容性或安全性目的控制库代码的特定版本

那么静态链接库代码可以解决这些问题。
1.我知道dynamic linking减少了程序文件的大小,但如果它是custom dynamic library,它仍然必须包含在安装程序中。因此,应用程序文件夹的最终大小不会改变。
也许吧。但是如果你的项目根据库提供了多个可执行文件呢?这种情况并不少见,在这种情况下,将库设置为动态链接库 * 确实 * 节省了持久存储设备上的保存空间。
即使只有一个可执行文件,让它使用共享库和/或成为共享对象本身也可以减少并发运行多个示例所需的内存量。
在任何情况下,如果您关注的是自己提供的自定义库,那么您应该首先根据构建库的原因来评估是将其构建为动态库还是静态库。例如,如果这纯粹是为了方便构造单个可执行文件的构建,那么它可能应该是一个静态库--但您可能仍然希望整个可执行文件是一个动态对象。
另一方面,如果多个可执行文件将链接库,特别是如果您打算公开它以供第三方应用程序使用,那么您可能应该提供它的共享库版本。您也可以选择提供静态库版本。
1.如果外部库已经安装在机器上,如何在项目设置(vs,cmake,qmake)中确定和指定其位置。在dynamic loading期间,您可以通过系统调用或Windows注册表找到位置。但是在dynamic linking期间如何做到这一点?
如果它安装在链接器默认搜索的位置之一,那么您就不需要手动定位它。如果不是,那么动态链接库的链接时间问题与静态链接库没有什么不同。当你遇到这个问题时,如何解决它的细节取决于操作系统和构建框架。例如,如果您正在使用CMake,那么共享库发行版可以通过提供CMake宏来确定库和头文件的位置以及其他细节来对此进行规定(许多人都这样做)。
在任何情况下,构建细节都是相对较少的人必须整理的东西,很少的时候。本答案开头所讨论的操作利弊是在一个更大的范围内。
当然,以上所有的假设你有一个选择。不是所有的系统都提供一个。

xxslljrj

xxslljrj2#

动态链接不仅减少了最终可执行文件的大小,而且还减少了应用程序的内存占用。如果您有两个应用程序,它们都是静态链接的,并且都使用一个公共的共享库,那么同一个共享库的两个副本将驻留在内存中,这是一种浪费。一般来说,你总是希望动态链接产生最小和最有效的代码。
那么什么时候使用静态链接比较合适呢?如果您不确定目标机器的操作系统版本,那么静态链接您的应用程序可以确保您的应用程序无论其版本如何都可以运行。此外,安全应用程序(如金融应用程序)是一个很好的候选者,因为它通过为每个进程提供独立的环境来将一个进程与另一个进程隔离开来,并且在任何应用程序之间都不共享代码。此外,静态链接提供了更快的执行速度,因为我们在编译时复制了整个库内容。因此,我们不必在运行时运行未解析符号的查询。因此,我们可以执行静态链接的程序比动态链接的程序更快。

相关问题