Linux动态和静态链接
Posted
技术标签:
【中文标题】Linux动态和静态链接【英文标题】:Linux dynamic and static linking 【发布时间】:2014-12-30 08:25:09 【问题描述】:我有一个与共享库 'A' 链接的可执行文件,它又使用共享库 'B'(用 Qt 编写的 GUI)。 当我编译可执行文件时,链接器会查找所有库,包括“B”,以及它需要的所有库(Qt 库)。 我如何才能将“B”库与可执行文件断开连接,使其在链接时不需要“B”。 我希望可执行文件不知道“B”库。
【问题讨论】:
为什么?如果不存在依赖项,您的可执行文件将如何运行? 让 A 在运行时加载 B 或在运行时加载 A。这会使您的应用程序变得更加复杂且容易出错,但会起作用。 你的问题一点都不清楚。 “链接器查找包括 B 在内的所有库”:它检查 A 的依赖项是否存在,但它不应直接与 B 链接,因此如果将 A 替换为不使用 B 的版本,它仍然可以而不要使用 B。您可以提供具有相同(空)符号列表的 A 的伪造版本,仅用于链接。 我发现可行的解决方案是通过 dlopen 在 A 中动态加载 B。这样,可执行文件就不必知道 B。 【参考方案1】:假设您可以从源代码构建依赖项“B”,您可以通过将“A”静态链接到“B”将其从可执行文件中隐藏。
在无法从源代码编译“B”的情况下,可以限制“B”中未明确使用的符号的可见性。您可以通过 Unix 系统上的“ld”命令完成此操作。我对此知之甚少。 This 帖子可能会提供一些建议。但是,它们给我的印象是非常明确和手动的,因此如果“B”是一个包含许多符号的大型库,则可能不太适用。我怀疑这不是你真正想要的。
您希望在您的可执行文件上调用“ldd”命令时不显示“B”。对吗?
或者您只是想让用户更轻松地安装可执行文件?如果是,您仍然可以在一定程度上自动化安装。
【讨论】:
我的目标是能够在不需要 UI 且未安装 Qt 的机器上仅使用 A 对象而不使用 B 来编译和运行可执行文件。以上是关于Linux动态和静态链接的主要内容,如果未能解决你的问题,请参考以下文章