我试图在我没有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访问权限。
我已经找到了一种方法来解决这个问题,使用https://amir.rachum.com/blog/2016/09/17/shared-libraries/解释的方法。解决方案是在编译期间使用rpath
。
根据文章
rpath
和runpath
之间的唯一区别是它们被搜索的顺序。具体来说,它们与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
文件中,以便在您注销时不会丢失。