【问题标题】:Shared Libraries in Project Folder项目文件夹中的共享库
【发布时间】:2015-02-24 10:52:59
【问题描述】:

我目前开始在 Linux (OpenSuse) 下使用共享库。我正在编写的共享库被一堆小程序使用,这些小程序为电气工程提供了一些工具。因此,图书馆是非常具体的。因此,我想将程序和共享库保留在用户主目录中。

到目前为止,我将项目文件夹的路径添加到 /etc/ld.so.conf ,效果很好。只有两个问题。

首先,用户需要 root 权限才能更改我想避免的 ld.so.conf 的内容。对于用户来说,软件的运行应该尽可能简单。

第二个问题是,如果用户重命名或移动项目文件夹(包含程序和库),程序将不再运行。这可能会让一些用户感到困惑。

有没有办法在没有 root 权限的情况下添加动态链接器的路径(我正在考虑从之前将当前路径添加到动态链接器的脚本启动我的应用程序)?

【问题讨论】:

    标签: linux shared-libraries


    【解决方案1】:

    让用户修改/etc/ld.so.conf绝对不是办法。

    一个简单的替代方法是覆盖用户 shell 初始化文件(.bashrc,...)中的 LD_LIBRARY_PATH 或更全局的 /etc/environment。

    例如:LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/YOUR_SHARED_LIB_PATH

    另一种选择是在编译应用程序时将rpath 选项添加到链接器,这样动态搜索路径将在搜索共享库时包含您的目录。

    但不建议这样做,因为它不灵活(您的目录移动,...)并且需要重新编译。

    【讨论】:

    • 谢谢,我认为使用 LD_LIBRARY_PATH 变量的方式是一种可接受的方式。我现在使用以下 shell 脚本启动我的应用程序,该脚本目前对我很有效。 #!/bin/bash PROGNAME=myprog BASEDIR=$(pwd) export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$BASEDIR DEPERROR=$(ldd testeseries | grep "not found") if [ "$DEPERROR" != "" ]; then echo "Dependency Error:" echo "Failed to load shared libraries needed for $PROGNAME" echo $DEPERROR else ./$PROGNAME fi
    【解决方案2】:

    您可以设置LD_LIBRARY_PATH 环境变量。您甚至可以为每个程序编写一些包装 shell 脚本(适当地设置 LD_LIBRARY_PATH)。

    你也可以链接到-Wl,-run-path之类的东西

    阅读Drepper's paper: how to write shared libraries

    顺便说一句,您应该为库确定一个固定位置,也许是$HOME/lib/,并避免移动包含它们的目录。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-26
    相关资源
    最近更新 更多