源码-复现
关于源码是一个简单的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
问题解决。