一种在没有 root 的情况下加载共享库的更简单方法

A simpler method to load shared libraries without root

本文关键字:加载 情况下 共享 方法 更简单 root 一种      更新时间:2023-10-16

我正在尝试在没有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下确实存在)

多亏了这个答案,我才能明确指定LD_LIBRARY_PATH并将程序运行为

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

因为我不是根,所以我也不能跑ldconfig。我想知道是否有办法加载动态库,而无需在运行程序且没有root访问权限时LD_LIBRARY_PATH前缀。

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

根据文章rpathrunpath是搜索它们的顺序。具体来说,他们的 与LD_LIBRARY_PATH的关系 - 之前搜索过rpathLD_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_PATHexport LD_LIBRARY_PATH=path/to/boost/build/lib。将此行添加到.~/.bashrc文件,以便在注销时不会丢失。

相关文章: