什么时候需要动态库

什么时候需要动态库

有人告诉我动态库很好,因为它可以节省 RAM,只有在程序运行时才需要它。

现在我有一个问题:如果一个程序可以执行,我是否可以说它需要的所有动态库都已经存在(不会有任何动态库丢失错误)?

假设一个程序来自三个.o文件的链接,每个.o文件都需要一个动态库。如果我删除一个动态库,程序还能运行吗?

据我所知,我们有两种加载动态库的方法:

  1. 当我们链接目标文件时加载一个动态库,例如 ,g++ a.cpp -ltest这里我们将动态库链接libtest.so到我们的程序中,如果我们删除libtest.so,我们将无法执行程序。
  2. 使用系统api函数加载动态库:dlopen.在这种情况下,据我了解,如果程序的执行不触及 的代码dlopen,我们就不会出现任何错误。

如果我是对的,我是否可以说如果程序的执行没有错误,这意味着它需要的所有动态库肯定都在那里?

答案1

这基本上取决于动态库是在程序启动时加载(这将是 ld.so 的正常行为),还是在首次执行需要它们的代码时延迟加载。在第一种情况下,程序将很早就因错误而终止。在第二种情况下,它可能根本不执行需要动态库的代码,而只是成功运行。第二种情况的一个例子是音频文件处理程序,它根据文件类型加载音频编解码器。如果您没有安装 mp3 编解码器,它可能仍适用于其他文件类型。 (muru 的评论指出了一个更深入讨论的问题)

相关内容