一种无需root即可加载共享库的简单方法

时间:2019-03-30 03:53:01

标签: c++ boost linker g++

我正在尝试在没有root访问权的服务器上编译并运行C ++程序。我在链接boost_iostreams库时遇到问题。

我可以通过使用-L标志指向boost安装目录来成功编译程序,如下所示:  g++ -I path/to/boost/build/include -o out prog1.cpp prog2.cpp -L path/to/boost/build/lib -lboost_iostreams

但是,如果我以./out的身份运行程序,则会收到错误error while loading shared libraries: libboost_iostreams.so.1.67.0: cannot open shared object file: No such file or directory,因为链接器无法找到libboost_iostreams.so.1.67.0(在path/to/boost/build/lib下确实存在)< / p>

感谢this的回答,我能够显式指定LD_LIBRARY_PATH并以

的身份运行程序

LD_LIBRARY_PATH="path/to/boost/build/lib" ./out

由于我不是root用户,所以我也无法运行ldconfig。我想知道是否有一种方法可以在运行程序且没有root用户访问权限时加载动态库而不必在前缀LD_LIBRARY_PATH之前加前缀。

1 个答案:

答案 0 :(得分:0)

我已经找到一种使用此处https://amir.rachum.com/blog/2016/09/17/shared-libraries/中说明的方法来解决此问题的方法。解决方案是在编译过程中使用rpath

  

根据文章rpath与   runpath是他们的搜索顺序。具体来说,   与LD_LIBRARY_PATH的关系-rpath在之前被搜索   之后搜索LD_LIBRARY_PATHrunpath。的含义   这是因为rpath不能随环境动态更改   runpath可以设置变量。

简而言之,一旦您使用-rpath path/to/boost/build/lib进行编译,就可以在运行时搜索包含库libboost_iostreams.so.1.67.0的目录,而不必添加前缀LD_LIBRARY_PATH="path/to/boost/build/lib" ./out

编译后 g++ -I path/to/boost/build/include -o out prog1.cpp prog2.cpp -L path/to/boost/build/lib -lboost_iostreams -rpath path/to/boost/build/lib

我能够毫无问题地运行./out

编辑1

正如Nikos在评论中指出的那样,您也可以通过LD_LIBRARY_PATH来设置export LD_LIBRARY_PATH=path/to/boost/build/lib。将此行添加到.~/.bashrc文件中,以便注销后不会丢失。