编译时需要动态库吗

问题描述 投票:0回答:2

我已阅读此链接并且我可以理解它的内容。

如图所示,我有一个关于动态库的问题。

说我已经编写了一个C++程序。据我了解,当我使用某些编译器,例如

gcc
来编译我的程序(例如,
g++ main.cpp
)时,它是关于执行步骤3和步骤4的工作,这意味着它只是关于编译和链接静态库。

但是,众所周知,我们可以在

-lXXX
后面附加
-LXXX
g++
来告诉它所需的动态库在哪里。据我了解,这是关于此图中的第 5 步。

所以现在我很困惑。如果命令

g++
正在执行编译和链接静态库的工作,为什么我们可以并且应该给它动态库? (如果没有,将会出现一些未定义的参考错误)

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

c++ dynamic makefile compilation
2个回答
1
投票

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

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

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

还应该指出,动态/共享库可能已经被另一个用户存储在内存中。在这种情况下,直到加载时才能完成地址的最终解析(内存中 F1() 实际存在的位置)。

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

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


0
投票

不是必需的,但链接器不会知道该符号实际上是未定义的,或者稍后会动态链接。

© www.soinside.com 2019 - 2024. All rights reserved.