一种在没有 root 的情况下加载共享库的更简单方法
A simpler method to load shared libraries without root
我正在尝试在没有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
。
根据文章
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
文件,以便在注销时不会丢失。
- 如何在没有"路径"模块的情况下加载 cheerp-wasm 程序?
- 有没有办法在不重新启动或注销的情况下加载游标?
- 一种在没有 root 的情况下加载共享库的更简单方法
- 如何在没有reinterpret_cast的情况下使用 dlsym() 加载函数?
- 有没有办法在不使用GDI+的情况下从我的资源加载.png
- 在未加载上下文的情况下在对象构造函数中使用OpenGL函数
- QT是否有其他方法可以在没有QTNetworkManager的情况下加载图像
- 如何在不使用外部库的情况下加载到 8 位C++位图图像
- 如何在没有背景的情况下加载 bmp
- 有没有办法在不加载的情况下读取 .so 文件的内容
- 如何在知道第一个元素的情况下加载结构
- 如何让火狐在不重新启动的情况下重新加载user_pref
- 如何在没有 p、q 等的情况下加载 RSA 密钥对
- 如何在没有Openssl或其他库的情况下加载RSA密钥对
- OpenGL在没有或有静态设备上下文的情况下加载纹理
- 是否可以在没有完全定义着色器的情况下测试缓冲区数据是否成功加载到GPU上?(C++、OpenGL 4.4、GLFW)
- 我们可以在不使用 c++ 中的任何库的情况下加载、显示和操作图像的矩阵吗?
- 如何在不完全重新加载每帧每个像素的情况下更改图像的 alpha 值/ 优化
- CImage::在不使用CreateStreamOnHGlobal的情况下从内存加载()
- 如何编写一个Excel C加载项函数,在不泄漏内存的情况下向Excel返回字符串