与具有依赖关系的动态库链接

2023-12-14

考虑以下场景:

  • 共享库 libA.so ,没有依赖项。
  • 共享库 libB.so,以 libA.so 作为其依赖项。

我想编译一个与 libB 链接的二进制文件。 我应该仅将二进制文件与 libB 链接还是与 libA 链接?

有没有办法只链接直接依赖项,让运行时依赖项中未解析的符号得到解析?

我担心库 libB 实现将来可能会发生变化,引入其他依赖项(例如 libC、libD、libE)。我会遇到问题吗?

换句话说:

  • libA文件:a.cpp a.h
  • libB 文件:b.cpp b.h
  • 主程序文件:main.cpp

当然,b.cpp包含a.h,main.cpp包含b.h。

编译命令:

g++ -fPIC a.cpp -c
g++ -shared -o libA.so a.o

g++ -fPIC b.cpp -c -I.
g++ -shared -o libB.so b.o -L. -lA

我应该使用以下哪个选项?

g++ main.cpp -o main -I. -L. -lB

or

g++ main.cpp -o main -I. -L. -lB -lA

我无法使用第一个选项。链接器抱怨库 libA 中的未解析符号。但这对我来说听起来有点奇怪。

非常感谢。

-- 更新评论:

当我链接二进制文件时,链接器将尝试解析 main 和 libB 中的所有符号。但是,libB 具有 libA 中未定义的符号。这就是链接器抱怨的原因。

这就是为什么我也需要与 libA 链接。 不过,我找到了一种方法来忽略共享库中未解析的符号。 看起来我应该使用以下命令行来执行此操作:

g++ main.cpp -o main -I. -L. -lB -Wl,-unresolved-symbols=ignore-in-shared-libs

看来还是可以用的-rpath选项。 但是我需要更好地理解它。

有谁知道使用时可能存在的陷阱-Wl,-unresolved-symbols=ignore-in-shared-libs option?

-- 更新评论2:

-rpath不应该用于此目的。强制在给定目录中找到库很有用。这-unresolved-symbol方法看起来好多了。

再次感谢。


看来您已经完成了大部分工作。你的调查做得很好。让我们看看我是否可以帮助澄清其背后的“原因”。

这就是链接器正在做的事情。当您链接可执行文件(上面的“main”)时,它有一些未解析的符号(函数和其他内容)。它将查找随后的库列表,尝试解决未解析的符号。在此过程中,它发现一些符号是由 libB.so 提供的,因此它指出它们现在已由该库解析。

但是,它还发现其中一些符号使用了可执行文件中尚未解析的其他符号,因此它现在也需要解析这些符号。如果不链接 libA.so,您的应用程序将是不完整的。一旦链接到 libA.so,所有符号都会被解析并且链接完成。

正如您所看到的,使用-unresolved-symbols-in-shared-libs,并不能解决问题。它只是推迟它,以便在运行时解析这些符号。就是这样-rpathis for:指定运行时要搜索的库。如果无法解析这些符号,您的应用程序将无法启动。

找出库依赖关系并不是一件容易的事情,因为一个符号可能由多个库提供,并且可以通过链接其中任何一个库来满足。

这里还有这个过程的另一个描述:为什么库的链接顺序有时会导致 GCC 中出现错误?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

与具有依赖关系的动态库链接 的相关文章

随机推荐

  • 在 OpenModelica 中模拟闭式液压循环

    我想对一个封闭的液压循环进行建模 正如人们可以在 Modelica 标准库 流体 示例 加热系统中找到的那样 对于供暖系统以及我的 简约 示例 我遇到了同样的问题 系统是超定的 在接下来的讲座中 您可以发现加热系统是一个 坏例子 所以我想这
  • Swift 中集合视图的横向方向

    我的集合视图单元格遇到横向问题 当应用程序处于纵向时 它为我提供每行正确的单元格数量 即 2 但是当我将应用程序旋转到横向时 它每行显示 1 个单元格 这是我得到的屏幕 Portrait Landscape 这是我添加单元格大小的代码 fu
  • 启动程序时出现“找不到主方法”错误? [复制]

    这个问题在这里已经有答案了 我正在为我的课程学习 Java 但我遇到了障碍 我的任务是开发一个简单的命令行程序 为了让事情变得更容易 我提供了以下示例代码进行修改 这样我就不必从头开始 package assignment public c
  • 如果服务器文件夹中存在文件,如何执行 SQL Server 代理作业?

    我需要每天导入一个平面文件 该文件每天都会更改名称 文件处理后 需要将其移动到另一个文件夹 我注意到我可以在 SQL Server 代理中安排作业 并且可以告诉它每小时左右运行一次 并且我可以向其中添加 CMD 命令 我找到的解决方案是运行
  • 如何在Python查询中按名称获取字段?

    我在Python脚本中使用Mysql连接 如何按名称从表中获取结果 cursor conn cursor cursor execute SELECT FROM local 现在我通过索引来做到这一点 results cursor fetch
  • 使用 VBA 合并 Excel 工作表

    我有一个 Excel 工作表 例如 OG xls 其中已有一些数据 其中有大约 5000 行 标题位于第一行 最多为 AN 列 这个行数 5000 全年都不会改变 现在我有 5 个 XL 文件 比如 A B C D E 这些文件中的数据每次
  • 使用批处理根据分辨率重命名我的视频文件

    我想根据视频文件的分辨率重命名它们 例如 对于 1080p 的视频 bla bla mp4 我想将其重命名为 bla bla H 264 1080p 该脚本应该能够自动检测视频的分辨率 而且如果文件已经被重命名 则不应重命名它 我无法找到检
  • 使用 iPhone 在 UIView 中嵌入视频

    我想编写一个在视图中下载 或流式传输 视频 根据需要编码 的应用程序 我不想使用 SDK 中的 MPVideoPlayer 因为它会全屏打开视频 我想在视频上放置另一个 UIView 透明 以便我的用户可以在视频上进行注释 任何人有任何想法
  • 限制 App Engine 对自定义域中的 G Suite 帐户的访问

    不久前 Google Apps 现在称为 G Suite 域的 App Engine 相关设置已移至 Google Cloud Console 截至目前 限制关联 G Suite 用户访问 App Engine 实例的记录方法是通过此 Go
  • 在 Jquery 中选择元素之前的同级?

    DOM 看起来像这样 div A div div B div div C div div D div div E div div F div div G div 现在我可以选择 div D div using div selected 那么
  • setInterval at 1ms 似乎实际上不是 1ms

    我正在尝试使用 HTTPRequest 来计算下载文件所需的时间 如下所示 function getFile use strict var url data bin var rawFile new XMLHttpRequest var ti
  • Openssl 和 PHP

    我正在尝试使用 PHP 加载 openssl cli 工具生成的私钥 我使用了以下命令和 PHP 代码 openssl genrsa des3 4096 out private key if key openssl pkey get pri
  • 来自纬度经度位置的国家/地区代码(不使用地理编码服务)

    如何从纬度经度位置获取国家 地区代码 我知道有许多地理编码服务可用 但它们不能满足我的要求 因为我的应用程序在上线几个小时后就被阻止 许多地理编码请求 大多数地理编码服务还提供商业服务 但它们还不是一种选择 因为该项目还处于起步阶段 我做了
  • 拆分函数添加: \xef\xbb\xbf...\n 到我的列表

    我想打开我的file txt并从此文件中分割所有数据 这是我的file txt some data1 some data2 some data3 some data4 some data5 这是我的 python 代码 gt gt gt f
  • 如何在codeigniter中将时间戳转换为日期

    我想转换1373892900000 to Monday 2013 07 15 8 55 AM在代码点火器中 但是 通过使用我编写的函数转换时间戳 我不断收到完全不同的结果 请注意 我需要根据不同的时区更改日期 这就是为什么我想这样写 pub
  • jqGrid loadonce 不适用于 asp.net

    有谁知道如何用 asp net asmx jqGrid 排序解决这个讨厌的问题 因为 为了从 jqGrid 调用 pagemethods 或 asmx Web 服务 需要像这样进行攻击 datatype function ajax url
  • 如何通过 Javascript 设置循环 iMacros?

    1 我无法通过javascript添加设置循环imacros 我该如何添加它 var macro macro CODE macro VERSION BUILD 8011895 n macro TAB T 1 n macro SET ERRO
  • Android - 获取对 Manifest 中定义的 BroadcastReceiver 的引用

    有什么方法可以从代码中获取 Manifest xml 中定义的 BroadcastReceiver 的引用吗 就我而言 我们使用的 BroadcastReceiver 需要包含在 Manifest xml 中 然而 它具有我想在我们的代码中
  • 使用 typeahead 和 Bloodhound 单击时显示完整的建议列表

    我将 Typeahead js 与 Bloodhound 建议引擎一起使用 并希望用户在搜索框中单击后立即显示该列表 我发现了这个 stackoverflow 问题 Twitter TypeAhead 以编程方式显示所有结果 这与我相同 答
  • 与具有依赖关系的动态库链接

    考虑以下场景 共享库 libA so 没有依赖项 共享库 libB so 以 libA so 作为其依赖项 我想编译一个与 libB 链接的二进制文件 我应该仅将二进制文件与 libB 链接还是与 libA 链接 有没有办法只链接直接依赖项