静态库如何链接到依赖项
How do static libraries do linking to dependencies?
假设我有libA。例如,它依赖于libSomething,因为libA的非内联方法会调用libSomething.h中的方法。在这种情况下,依赖关系是如何链接起来的?libA必须在编译时静态链接到libSomething,还是libA的用户(使用libA的应用程序)需要链接到libA和libSomething?
谢谢
静态链接只是将整个项目(函数,常量等)复制到结果可执行文件中。如果静态库的代码包含对某些共享库项的引用,则这些引用将成为结果可执行文件中的依赖项。如果您链接一个库而不是可执行文件,则同样适用。
静态库或多或少是未链接的二进制对象文件(*。O或*.obj),在编译存档时,不检查依赖项。当一个人链接一个人的二进制可执行文件(或共享库/DLL)时,链接器检查所有必要的依赖项,只有这样才会提醒你任何问题。
在构建过程中,编译器将代码转换为临时格式,我们称其为目标文件。在目标文件中,有一个编译器无法解析的符号列表,通常是其他地方的定义。链接阶段负责解析这些符号。
构建过程将文件提供给链接器,直到解析所有符号为止。没有物理依赖列表,只有需要解析的符号列表。这允许通过使用不同的库来解析符号。例如,有人可能想要使用Windows库来解决Windows特定的问题;针对Linux特定问题的Linux库。这并没有明确地声明一个程序依赖于一个Windows库;它也可能依赖于Linux。
一些编译器可以生成依赖项列表,通常用于构建过程。然而,最终的责任还是在于程序员。
相关文章:
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- VS 2015 链接错误 无法构建依赖于 libcurl 的项目
- 使用Bazel构建具有不同编译器/链接器选项的C/C++依赖关系
- 在链接可执行文件之前查找静态库未解析的依赖项
- aarch64动态链接器rpath使用辅助依赖链接
- 链接二进制库或共享库时,为什么必须传入我依赖的共享库?
- 单独库中的类成员函数定义和链接依赖项
- 可视C++ - 从链接器>输入>其他依赖项中排除文件
- 链接共享库依赖项未在 ldd 中列出
- 您如何将所有链接依赖项都包装到一个Linux静态库中
- 模板或链接接缝依赖注入有哪些替代方案来测试非虚拟方法?
- 使用C 中的链接seam break static变量依赖关系
- GHC 不链接依赖项
- C++ 生成文件不编译依赖项/链接错误?
- 模型依赖关系目标,在运行时链接
- 视觉如何引用部署与2015 C 链接库依赖关系
- 将库与NuGet包链接为Visual Studio中的依赖项
- Cmake不会将共享库的链接依赖关系传播到我的可执行文件
- 链接自身依赖于静态库的静态库时未定义的引用
- 如何在二进制文件中包含共享库依赖项(不使用.deb或.rpm)和/或针对PulseAudio的静态链接