c++ - 将共享库的搜索路径更改为 Makefile 中提供的 rpath
问题描述
libA.so
我使用需要的 C++ 共享库libB.so.1.0
,而libB.so.2.0
我的系统上已安装。
我无法更改此设置或将任何文件添加到 /usr/lib/ 或 /lib/。
我已经转移libB.so.1.0
到我的本地 lib 文件夹并使用rpath
. 但是,此路径不用于查找(但 rpathlibB.so.1.0
用于 libA.so
直接链接的其他共享库)。Chrpath 只能用于更改现有的 rpath,但此库使用系统搜索路径。所以我认为这不是一个选择。
问题是:有没有办法将我在 Makefile 中设置的 rpath 传播到间接包含的库 libB.so.1.0
,如果没有,我还有哪些其他选项,最好不手动设置 LD_LIBRARY_PATH?
ldd- 输出(for libA.so
)如下所示:
11118: find library=libboost_system.so.1.58.0 [0]; searching
11118: search cache=/etc/ld.so.cache
11118: search path=/lib/x86_64-linux-gnu/tls/haswell/x86_64:/lib/x86_64-
linux-gnu/tls/haswell:/lib/x86_64-linux-gnu/tls/x86_64:/lib/x86_64-linux-
gnu/tls:/lib/x86_64-linux-gnu/haswell/x86_64:/lib/x86_64-linux-gnu/haswell:
/lib/x86_64-linux-gnu/x86_64:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-
gnu/tls/haswell/x86_64:/usr/lib/x86_64-linux-gnu/tls/haswell:/usr/lib/x86_64-
linux-gnu/tls/x86_64:/usr/lib/x86_64-linux-gnu/tls:/usr/lib/x86_64-linux-
gnu/haswell/x86_64:/usr/lib/x86_64-linux-gnu/haswell:/usr/lib/x86_64-linux-
gnu/x86_64:/usr/lib/x86_64-linux-gnu:/lib/tls/haswell/x86_64:/lib/tls/haswell:
/lib/tls/x86_64:/lib/tls:/lib/haswell/x86_64:/lib/haswell:/lib/x86_64:
/lib:/usr/lib/tls/haswell/x86_64:/usr/lib/tls/haswell:/usr/lib/tls/x86_64:
/usr/lib/tls:/usr/lib/haswell/x86_64:/usr/lib/haswell:/usr/lib/x86_64:
/usr/lib (system search path)
11118: trying file=/lib/x86_64-linux-gnu/tls/haswell/x86_64/libboost_system.so.1.58.0
11118: trying file=/lib/x86_64-linux-gnu/tls/haswell/libboost_system.so.1.58.0
11118: trying file=/lib/x86_64-linux-gnu/tls/x86_64/libboost_system.so.1.58.0
11118: trying file=/lib/x86_64-linux-gnu/tls/libboost_system.so.1.58.0
11118: trying file=/lib/x86_64-linux-gnu/haswell/x86_64/libboost_system.so.1.58.0
11118: trying file=/lib/x86_64-linux-gnu/haswell/libboost_system.so.1.58.0
11118: trying file=/lib/x86_64-linux-gnu/x86_64/libboost_system.so.1.58.0
11118: trying file=/lib/x86_64-linux-gnu/libboost_system.so.1.58.0
11118: trying file=/usr/lib/x86_64-linux-gnu/tls/haswell/x86_64/libboost_system.so.1.58.0
11118: trying file=/usr/lib/x86_64-linux-gnu/tls/haswell/libboost_system.so.1.58.0
11118: trying file=/usr/lib/x86_64-linux-gnu/tls/x86_64/libboost_system.so.1.58.0
11118: trying file=/usr/lib/x86_64-linux-gnu/tls/libboost_system.so.1.58.0
11118: trying file=/usr/lib/x86_64-linux-gnu/haswell/x86_64/libboost_system.so.1.58.0
11118: trying file=/usr/lib/x86_64-linux-gnu/haswell/libboost_system.so.1.58.0
11118: trying file=/usr/lib/x86_64-linux-gnu/x86_64/libboost_system.so.1.58.0
11118: trying file=/usr/lib/x86_64-linux-gnu/libboost_system.so.1.58.0
11118: trying file=/lib/tls/haswell/x86_64/libboost_system.so.1.58.0
11118: trying file=/lib/tls/haswell/libboost_system.so.1.58.0
11118: trying file=/lib/tls/x86_64/libboost_system.so.1.58.0
11118: trying file=/lib/tls/libboost_system.so.1.58.0
11118: trying file=/lib/haswell/x86_64/libboost_system.so.1.58.0
11118: trying file=/lib/haswell/libboost_system.so.1.58.0
11118: trying file=/lib/x86_64/libboost_system.so.1.58.0
11118: trying file=/lib/libboost_system.so.1.58.0
11118: trying file=/usr/lib/tls/haswell/x86_64/libboost_system.so.1.58.0
11118: trying file=/usr/lib/tls/haswell/libboost_system.so.1.58.0
11118: trying file=/usr/lib/tls/x86_64/libboost_system.so.1.58.0
11118: trying file=/usr/lib/tls/libboost_system.so.1.58.0
11118: trying file=/usr/lib/haswell/x86_64/libboost_system.so.1.58.0
11118: trying file=/usr/lib/haswell/libboost_system.so.1.58.0
11118: trying file=/usr/lib/x86_64/libboost_system.so.1.58.0
11118: trying file=/usr/lib/libboost_system.so.1.58.0
解决方案
我已将 libB.so.1.0 转移到我的本地 lib 文件夹并使用 rpath 将应用程序链接到它。但是,此路径不用于为 libA.so 查找 libB.so.1.0(但 rpath 用于直接链接的其他共享库)。
这是应用程序具有时的预期行为RUNPATH
(这是在链接时指定的较新的默认值-rpath
)。
您想要的是“递归”行为RPATH
。解释差异的文档。
第 1 步:确认您的应用确实在使用RUNPATH
:
readelf -d a.out | egrep 'RPATH|RUNPATH'
第2步:使用-rpath=... -Wl,--disable-new-dtags
链接您的应用程序,并确认RPATH
现在正在使用。
第三步:确认libB.so.1.0
现在找到了。
享受 :-)
推荐阅读
- android - 货币的 NumberFormat 在不同的 android 版本上为相同的语言环境返回不同的值
- flutter - 如何在代理后面的 Powershell 中使用 Flutter?
- c++ - 使用 msvc 15 在 Qt5.13 中编译 CUDA 代码
- wordpress - revslider 预加载密钥请求错误?
- schema - 架构未指定类型
- ajax - asp.net核心用ajax发送formfile,我不能在控制器中归档
- c# - 尽管我给出了一些偏移量,但我的游戏对象仍然紧挨着生成
- c# - 单独运行子进程时会影响原始dll
- java - 测试包含日期字段的对象
- c# - Azure Functions - C# - 运行外部应用程序?