我正在尝试在没有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
之前加前缀。
答案 0 :(得分:0)
我已经找到一种使用此处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
文件中,以便注销后不会丢失。