c++ - 关于C/C++静态库的推理

标签 c++ build-process static-libraries dynamic-linking abi

我从来没有想过下面的问题,但由于我现在不得不处理我的代码中的一堆依赖关系,我想我最好弄清楚我的事实。让我们将其限制为现代 Linux 版本,例如 ubuntu amd64。

由于静态库不包含动态库引用, undefined symbol 如何 在静态库中解决?依赖二进制文件是否可以动态加载 undefined symbol ,或者这些符号必须在编译时由另一个静态库或目标文件解析?

编译器是否可以通过链接动态库来解析(依赖于静态库的应用程序的)依赖关系,如果是这样,代码文本是否会静态解析为生成的二进制文件,或者是否存在动态引用?

例如,静态库 L 使用 libc6.so 中的 malloc,它将被应用程序 A 使用>。 LA 都会动态地使用 libc6.so 中的 malloc 吗?

最佳答案

静态库只不过是一起归档的目标文件列表。

How are undefined symbols resolved in static libraries?

它们没有被解析,因为没有 undefined symbol 。 Symbol 仅在链接阶段被认为是未定义的,并且当您创建静态库时没有链接正在进行。

当您将二进制文件链接到静态库时,可能会有 undefined symbol 。在这种情况下,静态库被视为程序的一部分,因此对该静态库中使用的符号的所有引用必须在您构建的程序范围内可用。比方说,如果程序 A 链接到静态库 B,而静态库 B 使用来自其他库 D 的符号 C,那么程序 A 必须链接到 BD

can a depending binary dynamically load the undefined symbols

是的,可以。但除非您真的需要懒惰的动态解析,否则您不应该这样做。

or must the symbols be resolved by another static library or object file at compile time

目标文件,以及静态库,不解析任何符号。它是执行此操作的链接器。

May the compiler resolve ...

编译器不解析任何依赖关系。这是链接器的工作。依赖关系可以在链接时解决,也可以在运行时由动态链接器解决。

the dependencies (of an application depending on a static library) by linking against a dynamic library, ...

链接器可以理解您正在使用的静态库取决于您链接的动态库中的符号。

and if so will the code text by statically resolved into the resulting binary or will a dynamic reference exist ?

如果您链接到一个共享库,则那里的任何内容都不会在您的程序中静态可用。这就是共享库的意义所在。只有 LTO 异常(exception)。至于您链接的静态库,该静态库中的任何内容都不会动态可用,它被编译进去,并且那些未使用的符号被删除。

For example the static Library L uses malloc from libc6.so and it will be used by application A. Will L and A both use the malloc from libc6.so dynamically ?

是的,除非 malloc() 的定义在编译静态库时可用,并且编译器出于某种原因只是内联了 malloc() 的主体进入静态库的代码。但是使用 malloc() 它不会发生。不过可能会遇到其他功能。

关于c++ - 关于C/C++静态库的推理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9605938/

相关文章:

c++ - 链接静态库时静态对象的初始化

c++ - 如何获取进程的进程原始文件名?

c++ - 无符号整数表示

delphi - 在项目之间共享 Delphi 源文件的最佳方式是什么?

java - 从 maven-antrun-plugin 调用 ant 脚本时出现 IllegalAccessError

c - 通过静态库链接时功能无法正常工作,但如果复制到 prog 中则可以正常工作

javascript - 从前端javascript中加载的DLL调用函数(在客户端javascript中加载dll)

c++ - 迭代器和整数的减法

build-process - 如何设置 rpmbuild 每次调用的构建区域

ios - 从静态库中获取版本号