【问题标题】:Is dynamic library necessary while compiling编译时是否需要动态库
【发布时间】:2018-07-25 02:11:09
【问题描述】:

我读过this link,我能理解它的意思。

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

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

但是,众所周知,我们可以将-lXXX-LXXX 附加到g++ 以告诉它必要的动态库在哪里。据我了解,这是关于此图像中的第 5 步。

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

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

【问题讨论】:

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

标签: c++ dynamic makefile compilation


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 2014-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多