gpt4 book ai didi

c++ - 将共享库的搜索路径更改为 Makefile 中提供的 rpath

转载 作者:太空狗 更新时间:2023-10-29 12:09:21 26 4
gpt4 key购买 nike

我使用 C++ 共享库 libA.so 需要 libB.so.1.0,而 libB.so.2.0 > 安装在我的系统上。

我无法更改它或将任何文件添加到/usr/lib/或/lib/。

我已将 libB.so.1.0 传输到我的本地 lib 文件夹,并使用 rpath 将应用程序链接到它。但是,此路径不用于为 libA.so 查找 libB.so.1.0(但 rpath 用于直接链接的其他共享库)。Chrpath 只能用于更改现有的 rpath,但此库使用系统搜索路径。所以我认为这不是一个选择。

问题是:有没有办法将我在 Makefile 中设置的 rpath 传播到间接包含的库 libB.so.1.0如果没有,我还有哪些其他选择,最好不要手动设置 LD_LIBRARY_PATH?

ldd- 输出(对于 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

最佳答案

I have transferred libB.so.1.0 to my local lib-folder and linked the application against it using rpath. However, this path is not used to find libB.so.1.0 for libA.so(but the rpath is used for other shared-libraries that are linked directly).

这是应用程序具有 RUNPATH 时的预期行为(这是在链接时指定 -rpath 时的较新默认值)。

您需要 RPATH 的“递归”行为。 Documentation解释差异。

第 1 步:确认您的应用确实在使用 RUNPATH:

readelf -d a.out | egrep 'RPATH|RUNPATH'

第 2 步:使用 -rpath=... -Wl,--disable-new-dtags 链接您的应用程序,并确认正在使用 RPATH .

第 3 步:确认现在找到了 libB.so.1.0

享受 :-)

关于c++ - 将共享库的搜索路径更改为 Makefile 中提供的 rpath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52666103/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com