错误:try using -rpath or -rpath-link

2023-05-16

在使用到动态库的时候,出现错误如下:

arm-linux/bin/ld: warning: libssl.so.0.9.8, needed by .//libcert.so, not found (try using -rpath or -rpath-link)

我仔细查看编译命令$(CFLAGS) –o target –L/usr/lib/ssl/ -lssl 发现是没有问题的,但是还是出现(try using -rpath or -rpath-link)的错误。

从字面意义上来看,libssl.so.0.9.8, needed by .//libcert.so, not found 意思是libcert.so库依赖libssl.so.0.9.8库。

这里看出 -Lssldir-lssl 好像没有起到作用。想知道原因需要涨点姿势,如下:

姿势点:链接选项和路径

现代连接器在处理动态库时将链接时路径(Link-time path)和运行时路径(Run-time path)分开,用户可以通过-L指定连接时库的路径,通过-R(或-rpath)指定程序运行时库的路径,大大提高了库应用的灵活性。比如我们做嵌入式移植时#arm-linux-gcc $(CFLAGS) –o target –L/work/lib/zlib/ -llibz-1.2.3 (work/lib/zlib下是交叉编译好的zlib库),将target编译好后我们只要把zlib库拷贝到开发板的系统默认路径下即可。或者通过-rpath(或-R )、LD_LIBRARY_PATH指定查找路径。

-L: “链接”的时候,去找的目录,也就是所有的 -lFOO 选项里的库,都会先从 -L 指定的目录去找,然后是默认的地方。编译时的-L选项并不影响环境变量LD_LIBRARY_PATH,-L只是指定了程序编译连接时库的路径,并不影响程序执行时库的路径,系统还是会到默认路径下查找该程序所需要的库,如果找不到,还是会报错,类似cannot open shared object file。

-rpath-link:这个也是用于“链接”的时候的,例如你显示指定的需要 libcert.so,但是 libcert.so 本身是依赖 libssl.so库 的,后者你并没有指定,而是 libcert.so 引用到它,这个时候,会先从 -rpath-link 给的路径里找。(注意动态库是运行时加载的哦)

-rpath: “运行”的时候,去找的目录。运行的时候,要找 .so 文件,会从这个选项里指定的地方去找。对于交叉编译,交叉编译链接器需已经配置 –with-sysroot 选项才能起作用。也就是说,-rpath指定的路径会被记录在生成的可执行程序中,用于运行时查找需要加载的动态库。-rpath-link 则只用于链接时查找。

综上所述

动态库中有复杂多个依赖关系时,最好加上-Wl,-rpath (-Wl必须加上的)。模板如下:

gcc -o foo foo.c -L/usr/local/lib -lfoo -Wl,-rpath=/usr/local/lib

$(CFLAGS) –o target –L/usr/local/ssl/lib -lssl -Wl,-rpath=/usr/local/ssl/lib

参考:https://www.cnblogs.com/flyinggod/p/8026567.html

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

错误:try using -rpath or -rpath-link 的相关文章

  • throw 和 try catch 的区别

    try catch是直接处理 xff0c 处理完成之后程序继续往下执行 xff0c throw则是将异常抛给它的上一级处理 xff0c 程序便不往下执行了
  • 什么是link标签?

    什么是link标签 link标签通常放置在一个网页的头部标签head标签内的用于链接外部css文件 链接收藏夹图标 favicon ico 标签最常见的用途是链接外部样式表 外部资源 link实例 链接外部css样式时候link标签的内容结
  • Linux下Qt程序运行时找不到so的解决办法

    一 全局性设置 将so放入相应的系统lib目录 修改环境变量 在环境变量中添加so所在路径 修改一些文件 在其中指定so所在路径 大概有上面的这3种方式 就不详细说了 相信大家都清楚 二 指定编译选项 上面介绍的方式 无一例外 都需要修改环
  • Java:简述try-catch-finally中return返回

    Java 简述try catch finally中return返回 Java 详解Java中的异常 Error与Exception Java 简述Java中的自定义异常 Java 简述throw throws异常抛出 Java 简述try
  • C++ using

    一 C 11前的使用 1 using申明 c primer plus 中 using申明 using 限定名称 限定名称 包含名称空间的名称 举例 using std cout 2 using编译指令 举例 using namespace
  • 我应该 Dispose() DataSet 和 DataTable 吗?

    DataSet 和 DataTable 都实现了 IDisposable 因此 根据传统的最佳实践 我应该调用它们的 Dispose 方法 然而 从我到目前为止所读到的内容来看 DataSet 和 DataTable 实际上没有任何非托管资
  • 如何使用 C#6“使用静态”功能?

    我正在看其中的几个新功能在C 6 具体来说 使用静态 using static is a new kind of using clause that lets you import static members of types direc
  • DB2 MERGE 语句错误

    我尝试了以下几种变体 但仍然出现错误 有什么方法可以解决这个问题 DB2 10 1 用于 z OS V10 的 DB2 对于以下 MERGE INTO TRGT t USING SRC s ON t ACCTID s ACCTID AND
  • 使用ffmpeg生成视频

    我正在尝试使用 ffmpeg 库从图像集生成视频 使用以下代码 我可以在模拟器上生成视频 但是当我在设备上运行它时 它会在视频中产生奇怪的绿色效果 我跟着使用 ffmpeg 将图像编码为视频网址 任何人都可以帮助我 或者如果可以提供代码片段
  • C#使用命名空间语句排序

    我想我在某处读到 排序你的 using 语句并删除未使用的语句会带来某种性能优势 但我似乎找不到任何证据或资源来支持这一点 这有什么道理吗 No the using用于设置命名空间的语句没有性能成本 无论语句的顺序如何 生成的 IL 代码都
  • 为什么#include 之后仍然需要使用 std::string ? [复制]

    这个问题在这里已经有答案了 为了使用字符串 我需要包含字符串标头 以便其实现可用 但如果是这样 为什么我还需要添加这一行using std string 为什么它还不知道字符串数据类型 include
  • C# using 语句如何转换为 Try-Finally

    我正在努力解决这个问题 根据这一页 https msdn microsoft com en us library yh598w02 aspx on Using声明 using 语句可确保即使在调用对象方法时发生异常 也会调用 Dispose
  • 整合银行账户[已关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有任何 API 可以将银行帐户集成到 NET 应用程序中 我希望为用户提供将银行对账单提取到我的软件
  • C++ 中隐藏特定函数的方法

    我有一份遗产struct A public B 我想对B隐藏个别功能 这可能吗 我知道相反的情况也可以使用using BMethod在 A 声明中 cheers 如果您想有选择地对 B 隐藏函数 那么首先使用公共继承就没有多大意义 使用私有
  • C# using 语句捕获错误

    我只是查看 using 语句 我一直知道它的作用 但直到现在还没有尝试使用它 我想出了以下代码 using SqlCommand cmd new SqlCommand reportDataSource new SqlConnection S
  • C#“使用”块

    我有类似下面的代码 这里有人提到 WebClient Stream 和 StreamReader 对象都可以从使用块中受益 两个简单的问题 1 这个小片段在使用块时会是什么样子 我自己做研究没有问题 所以资源链接很好 但只看一个例子会更快更
  • C# using 语句

    我真的很想把这件事从我的脑海里赶出去 请看下面的代码 using DataTable resultTable DBUtility GetSingleDBTableResult connectionString SELECT FROM MyD
  • 使用 -L 添加 link_library 时,Cmake 未设置 RPATH

    按以下方式设置链接库时 target link libraries SOME TARGET L somedir lfoo cmake 不处理 RPATH 使用 L 和 l 不是最佳实践 还是实际上完全错误 创建我自己的 Find cmake
  • 使用特定的 url 地址从 java 代码关闭浏览器

    1 我想使用我的java代码中的url地址关闭特定的浏览器选项卡 因为它是一个客户端服务器应用程序 我想使用客户端应用程序中的 url 地址关闭浏览器选项卡 服务器端将有一个 jar 它将与客户端请求进行通信 并从客户端获取 url 并根据
  • 自定义框架未加载 dyld:库未加载:@rpath/Custom.framework/

    我有一个带有多个自定义动态框架的应用程序 这意味着我使用 iOS 8 作为 Xcode 6 2 上的 SDK 我的 Mac 在优胜美地 这些框架有 Swift 源代码和资源 该应用程序是分布式企业应用程序 因此我只需创建一个 IPA 并通过

随机推荐