编译时是否需要动态库

时间:2018-07-25 02:11:10

标签: c++ dynamic makefile compilation

我已经读过this link,我可以理解它的意思。

enter image description here

如该图所示,我对动态库有疑问。

说我已经编写了一个C ++程序。据我了解,当我使用某种编译器(例如gcc来编译程序(例如g++ main.cpp)时,它是关于执行步骤3和步骤4的工作,这意味着它仅与编译和链接静态库有关。

但是,众所周知,我们可以在-lXXX后面附加-LXXXg++来告诉它必要的动态库在哪里。据我了解,这是关于这张图片中的第5步。

所以现在我很困惑。如果命令g++正在完成有关编译和链接静态库的工作,为什么我们也应该为它提供动态库? (如果没有,将会出现一些未定义的参考错误)

在编译和链接时是否需要动态库?如果是这样,为什么这张图告诉我们步骤5是运行的一部分,而不是构建的一部分?

1 个答案:

答案 0 :(得分:1)

比方说,您的主程序称为一个库函数F1(),该函数可以位于静态库中,也可以位于动态库中。

如果它在静态库中,则该库将在编译/链接时加载,并且F1()的地址可以固定(相对于程序起始地址)。当您运行该程序时,加载程序无需查找该库-该文件已是exe的一部分。

如果F1()在动态库中,则编译器可能不知道F1​​()或其任何子依赖项的大小。 (它仅通过.h文件知道其签名)。当您运行程序时,exe可以“建议”加载程序,它也需要加载动态库。当加载程序可以访问有关exe及其库的完整信息并可以执行其“动态链接”工作时,最终链接将在加载时完成。

还应指出,动态/共享库可能已被另一个用户存储在内存中。在这种情况下,地址的最终解析(实际上是内存F1()所在的位置)在加载之前无法完成。

无论如何,编译器/链接器需要知道库是静态的还是动态的/共享的。

Gcc或其他编译器中的确切过程可能不同于此简单的解释,但是应该清楚编译器/链接器需要知道库是静态还是动态的原因。