一种更简单的方法来加载没有root的共享库

问题描述 投票:0回答:1

我试图在我没有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下)

感谢this的回答,我能够明确指定LD_LIBRARY_PATH并运行该程序

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

由于我不是root,我也不能运行ldconfig。我想知道是否有一种加载动态库的方法,而不必在运行程序时没有为LD_LIBRARY_PATH加前缀,也没有root访问权限。

c++ boost linker g++
1个回答
0
投票

我已经找到了一种方法来解决这个问题,使用https://amir.rachum.com/blog/2016/09/17/shared-libraries/解释的方法。解决方案是在编译期间使用rpath

根据文章rpathrunpath之间的唯一区别是它们被搜索的顺序。具体来说,它们与LD_LIBRARY_PATH - rpath的关系在LD_LIBRARY_PATH之前搜索,而runpath在之后被搜索。这意味着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文件中,以便在您注销时不会丢失。

© www.soinside.com 2019 - 2024. All rights reserved.