PCL rpath解决so动态库依赖

  1. 依赖库搜索流程
    动态库或可执行文件,是如何找到它所依赖的库的? 是按以下目录顺序来搜索:

     the RPATH binary header (set at build-time) of the library causing the lookup (if any)
     the RPATH binary header (set at build-time) of the executable
     the LD_LIBRARY_PATH environment variable (set at run-time)
     the RUNPATH binary header (set at build-time) of the executable
     base library directories (/lib and /usr/lib)
    

则当我们所依赖的so库无法找到指定库时,我们可以通过ldd xxx.so查看这个so库所依赖的其他库以及其路径

如:

 ty@ty-pc:~/anaconda3/envs/py3/lib/python3.7/site-packages/pcl$ ldd _pcl.cpython-37m-x86_64-linux-gnu.so 
    linux-vdso.so.1 =>  (0x00007ffe645f9000)
    libpcl_io.so.1.7 => /usr/lib/x86_64-linux-gnu/libpcl_io.so.1.7 
    libOpenNI.so.0 => /usr/lib/libOpenNI.so.0 (0x00007f4d70bdc000)
    libpcl_registration.so.1.7 => /usr/lib/x86_64-linux-gnu/libpcl_registration.so.1.7 
    libpcl_segmentation.so.1.7 => /usr/lib/x86_64-linux-gnu/libpcl_segmentation.so.1.7 
    libpcl_features.so.1.7 => /usr/lib/x86_64-linux-gnu/libpcl_features.so.1.7 
    libpcl_filters.so.1.7 => /usr/lib/x86_64-linux-gnu/libpcl_filters.so.1.7 
    libpcl_sample_consensus.so.1.7 => not found
    libpcl_surface.so.1.7 => /usr/lib/x86_64-linux-gnu/libpcl_surface.so.1.7
...

如果某一行末尾为not found,则说明有依赖库没有找到对应的文件。

  1. 查看RPATH
    当我们发现缺少so库时,说明此so的依赖库搜索路径中并不包含所需要的so。此时我们可以通过修改其rpath路径,将其指向包含依赖so的路径。首先查看其已有RPATH路径:

     readelf -d _pcl.cpython-37m-x86_64-linux-gnu.so | grep RPATH
     或
     
     
     patchelf --print-rpath _pcl.cpython-37m-x86_64-linux-gnu.so
    
  2. 修改RPATH
    如果以上打印出的路径中不包含步骤1中not found所需要的so库,则可以通过locate xxx.so的方式,全局搜索这个so库,然后找到其路径,例如:/usr/lib/OpenNI2/Drivers/libDummyDevice.so

首先下载patchelf源码,并进行编译安装patchelf工具:

./configure
make
sudo make install

然后执行命令,将这个依赖so所在目录设置给当前so:

 patchelf --set-rpath /usr/lib/OpenNI2/Drivers ./_pcl.cpython-36m-x86_64-linux-gnu.so
  1. 验证so依赖
    再次执行ldd xxx.so如果之前not found的那一行正确链接,说明配置ok。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值