【问题标题】:A simpler method to load shared libraries without root一种无需root即可加载共享库的更简单方法
【发布时间】:2019-08-21 00:25:21
【问题描述】:

我正在尝试在没有 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。我想知道是否有一种方法可以加载动态库,而无需在运行程序且没有 root 访问权限时添加前缀 LD_LIBRARY_PATH

【问题讨论】:

    标签: c++ boost linker g++


    【解决方案1】:

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

    根据文章rpathrunpath 是他们被搜索的顺序。具体来说,他们的 与 LD_LIBRARY_PATH 的关系 - rpath 在之前搜索 LD_LIBRARY_PATHrunpath 在之后搜索。的含义 这是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 在 cmets 中指出的那样,您也可以将 LD_LIBRARY_PATH 设置为 export LD_LIBRARY_PATH=path/to/boost/build/lib。将此行添加到.~/.bashrc 文件中,以便在您注销时不会丢失。

    【讨论】:

    • 您可以在您的~/.bashrc 文件中添加export LD_LIBRARY_PATH=path/to/boost/build/lib
    • @NikosC。哦,那要容易得多。我犯了一个菜鸟错误,没有使用export,并尝试设置LD_LIBRARY_PATH=path/to/boost/build/lib,但没有用。不管作为指向运行时共享库​​的替代方法,我都会在此处保留答案。
    猜你喜欢
    • 2013-10-07
    • 2014-02-19
    • 2014-10-26
    • 2014-11-06
    • 2021-11-04
    • 2021-10-12
    • 1970-01-01
    • 2011-01-24
    • 2023-03-12
    相关资源
    最近更新 更多