gpt4 book ai didi

c++ - 编译时是否需要动态库

转载 作者:行者123 更新时间:2023-11-30 04:58:52 24 4
gpt4 key购买 nike

我读过 this link我能理解它说的是什么。

enter image description here

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

说我编写了一个 C++ 程序。据我了解,当我使用一些编译器,例如gcc来编译我的程序(例如,g++ main.cpp)时,它就是在做这一步的工作3和第4步,这意味着它只是关于编译和链接静态库。

不过,众所周知,我们可以在g++后面附加-lXXX-LXXX,告诉它需要的动态库在哪里.据我了解,这与此图中的第 5 步有关。

所以现在我很困惑。如果命令 g++ 正在执行编译和链接静态库的工作,为什么我们可以而且应该给它动态库? (如果没有,将会有一些 undefined reference 错误)

编译链接时是否需要动态库?如果是这样,为什么这个图像告诉我们第5步是run的部分,而不是build的部分?

最佳答案

假设您的主程序调用了一个库函数 F1(),它可以在静态库或动态库中。

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

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

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

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

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

关于c++ - 编译时是否需要动态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51509895/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com