有人告诉我动态库很好,因为它可以节省 RAM,只有在程序运行时才需要它。
现在我有一个问题:如果一个程序可以执行,我可以说它需要的所有动态库都在那里(不会有任何动态库丢失错误)?
说一个程序来自三个.o
文件的链接,每个.o
文件都需要一个动态库。如果我删除了一个动态库,我还能让程序运行吗?
据我所知,我们有两种加载动态库的方法:
- 当我们链接目标文件时加载一个动态库,例如,
g++ a.cpp -ltest
这里我们将动态库链接libtest.so
到我们的程序,如果我们删除了libtest.so
,我们将无法执行程序。 - 使用系统 api 函数加载动态库:
dlopen
. 在这种情况下,根据我的理解,如果程序的执行没有触及 的代码dlopen
,我们不会有任何错误。
如果我是对的,我能说如果程序的执行没有错误,就意味着它需要的所有动态库都肯定存在吗?
这基本上取决于动态库是在程序启动时加载(这将是 ld.so 的正常行为)还是在首次执行需要它们的代码时延迟加载。在第一种情况下,程序将很早就因错误而终止。在第二种情况下,它可能根本不执行需要动态库的代码而只是成功运行。第二种情况的一个例子是一个音频文件处理程序,它根据文件类型加载音频编解码器。如果您没有安装 mp3 编解码器,它可能仍适用于其他文件类型。(muru 的评论指出了一个更深入讨论的问题)