指定了rpath但是可执行程序某些动态链接库路径依然不正确

源码-复现

关于源码是一个简单的demo

// main.cpp
#include <iostream>
#include <vector>
#include <cmath>

using namespace std;

int main(int argc, char *argv[])
{
   vector<vector<vector<int>>> three_data;
   vector<vector<int>> three_data_elem;
   double y = std::sin(2.5);
   for(int i = 0; i < 3; ++i)
   {
	   vector<int> tmp;
	   for(int j = 0; j < 100; ++j)
	   {
		   tmp.push_back(j+i*100);
	   }
	   three_data_elem.push_back(tmp);
   }
   three_data.push_back(three_data_elem);
   std::cout << "Hello CMake! " <<three_data_elem.size() << std::endl;
   std::cout << "sin(2.5) = " << y << std::endl;
   return 0;
}

利用g++ main.cpp -o stand_cmake 编译程序。

利用ldd查看程序的依赖库
在这里插入图片描述
根据依赖库的库的路径复制依赖库到源码同一目录下的depend_shared_libs文件夹中,g++指定rpath编译程序g++ main.cpp -Wl,-rpath='./depend_shared_libs' -o stand_cmake

再利用ldd查看程序的依赖库
在这里插入图片描述
可以看到除了libm,stand_cmake都通过rpath找到了本地的依赖库而不是系统的。

思考-解决

rpath配置的没问题,不可能有的依赖库找到的是本地的,有的是系统的;那就是某些依赖库依赖了libm,g++的配置只约束了stand_cmake的寻找路径,确定一下是不是这个问题,设置LD_LIBRARY_PATH:export LD_LIBRARY_PATH=/home/ubuntu/C/cmake_stand/cmake_stander_project/depend_shared_libs:$LD_LIBRARY_PATH,再次ldd stand_cmake
在这里插入图片描述

这次没问题了,那就需要分析是哪个依赖库依赖了libm。

libstdc++:
在这里插入图片描述
libgcc_s:
在这里插入图片描述
libc
在这里插入图片描述
明显看出libstdc++依赖了libm,这样只要将libstdc++的rpath设置一下就好了。
执行:patchelf --set-rpath '${ORIGIN}' libstdc++.so.6
在这里插入图片描述
再次ldd查看stand_cmake

在这里插入图片描述
问题解决。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值