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

时间:2018-10-05 12:53:21

标签: c++ linux gcc shared-libraries ldd

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

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

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

问题是:是否可以将我在Makefile中设置的rpath传播到间接包含的库中libB.so.1.0 ,如果没有,我还有什么其他选择,最好不用手动设置LD_LIBRARY_PATH?

用于libA.so的ldd- Ouput看起来像这样:

 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

1 个答案:

答案 0 :(得分:1)

  

我已经将libB.so.1.0转移到我的本地lib文件夹中,并使用rpath将应用程序链接到它。但是,该路径并不用于为libA.so找到libB.so.1.0(而是rpath用于其他直接链接的共享库)。

这是应用程序具有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

享受:-)