C++ 编译时是否需要动态库

C++ 编译时是否需要动态库,c++,dynamic,makefile,compilation,C++,Dynamic,Makefile,Compilation,我读过,我能理解它说的话 如图所示,我有一个关于动态库的问题 说我已经编码了一个C++程序。据我所知,当我使用一些编译器,例如gcc来编译我的程序(例如,g++main.cpp)时,它是关于完成步骤3和步骤4的工作,这意味着它只是关于编译和链接静态库 然而,我们都知道,我们可以将-lXXX或-lXXX附加到g++中,告诉它所需的动态库在哪里。据我所知,这是关于图中的第5步 所以现在我很困惑。如果命令g++正在进行编译和链接静态库的工作,那么为什么我们可以并且应该给它动态库呢?(如果没有,将出现

我读过,我能理解它说的话

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

说我已经编码了一个C++程序。据我所知,当我使用一些编译器,例如
gcc
来编译我的程序(例如,
g++main.cpp
)时,它是关于完成步骤3和步骤4的工作,这意味着它只是关于编译和链接静态库

然而,我们都知道,我们可以将
-lXXX
-lXXX
附加到
g++
中,告诉它所需的动态库在哪里。据我所知,这是关于图中的第5步

所以现在我很困惑。如果命令
g++
正在进行编译和链接静态库的工作,那么为什么我们可以并且应该给它动态库呢?(如果没有,将出现一些未定义的引用错误)


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

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

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

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

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

在任何情况下,编译器/链接器都需要知道库是静态库还是动态库/共享库


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

动态库通常分为两部分:字典和实现。编译和链接需要“字典”,因为字典包含动态库中的函数声明。在某些平台中,库具有“dll”扩展,字典具有“lib”扩展;有时也可能有一个带有函数声明的头文件。字典还包含链接信息,例如函数在动态库中的位置。