我使用的C++共享库libA.so
需要libB.so.1.0
,而我的系统上安装了libB.so.2.0
。
我无法更改此设置或将任何文件添加到/usr/lib/或/lib/。
我已经将libB.so.1.0
转移到我的本地lib-folder中,并使用rpath
将应用程序链接到它。
但是,此路径不用于查找libB.so.1.0
的libA.so
(但是rpath用于其他直接链接的共享库)。
Chrpath只能用于更改现有的rpath,但是此库使用系统搜索路径。因此,我相信这不是一个选择。
问题是:是否可以将我在Makefile中设置的rpath传播到间接包含的库 libB.so.1.0
,如果没有,我还有哪些其他选项?最好不要手动设置LD_LIBRARY_PATH?
ldd- Ouput(用于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
最佳答案
当应用程序具有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/