c++ - 静态和共享库及其交叉链接
问题描述
在阅读了很多帖子之后,我仍然对共享库和静态库以及它们如何交叉链接的方式感到困惑。
所以我的理解是,当我有一个链接到静态库的可执行文件时,可执行文件会将其所需的函数/资源的全部内容复制到自身中,因此当它运行时,它不再需要静态库。如果可执行文件链接到共享库,那么它只会为它需要的所有内容创建占位符,所以当它运行时,它需要路径中的共享库,因此它可以将内容加载到占位符。
如果上面的说法是正确的,那么下面的说法是否正确?
A
当我构建一个链接到共享库的静态库,B
然后构建一个可执行文件C
链接到A
最初来自B
. 结果,当我运行时C
,我不会A
被呈现,因为所有需要的内容都已经在C
,但B
仍然需要。A
当我构建一个链接到静态库的共享库,B
然后构建一个C
链接到A
最初来自B
. 结果,当我运行时C
,我只需要A
但不是B
因为所需的所有内容都已经在A
.
解决方案
当我有一个链接到静态库的可执行文件时,可执行文件会将其所需的函数/资源的全部内容复制到自身中,因此当它运行时,它不再需要静态库
正确的。
如果可执行文件链接到共享库,那么它只会为它需要的所有内容创建占位符,所以当它运行时,它需要路径中的共享库
当然,它需要访问共享库。找到共享库的规则因平台而异。
当我构建一个链接到共享库 B 的静态库 A,然后为最初来自 B 的函数构建一个链接到 A 的可执行 C 时。结果,当我运行 C 时,我不会显示 A因为所有需要的内容都已经在 C 中,但仍然需要 B。
正确的
当我构建一个链接到静态库 B 的共享库 A,然后为最初来自 B 的函数构建一个链接到 A 的可执行 C。结果,当我运行 C 时,我只需要 A 而不是 B所有需要的内容都已经在A中
正确的
本质上,当您链接到静态库时,您在运行时永远不需要它,而当您链接到共享库时,您需要它。
推荐阅读
- airflow - 气流将任务实例状态设置为以编程方式跳过
- firebase - DialogFlow Fulfillment 中的代码问题,因为它无法识别 Firebase 异步函数
- javascript - .js 文件中的 MathJax 中的大括号缩放不正确
- spacy - 如何将词汇特征分配给 spaCy 中新的不可分析的标记?
- html - 如何在 PWA 服务工作者中缓存带有通配符的路由?
- mvvm - 我的大部分平台特定代码应该在 MVVM 中的什么位置?(旁边的视图)
- android - BottomNavigationView android 舍入和缩放选定的 MenuItem
- python-3.x - 使用 Python 将命令从 Windows 笔记本电脑发送到 micropython ev3
- azure - 如何在 Azure 数据工厂的复制数据活动映射中将货币转换为十进制
- java - 是否为以下场景更新 REST API 中的幂等请求?