【问题标题】:Unix question: Automatically recognize path for locally installed librariesUnix 问题:自动识别本地安装库的路径
【发布时间】:2008-11-04 05:50:44
【问题描述】:

我在 Fedora Linux 机器上工作。

我在本地主目录下安装了大量的二进制文件和库。

我想设置我的系统,以便在那里安装软件的方式(对我而言)与 root 用户在没有前缀的情况下安装它的方式相同。

通过将目录添加到我的 PATH 变量中,我可以运行安装在 ~/local/bin 中的二进制文件,但是如何链接到 ~/local/lib 和 ~/local/lib64 中的库?

是否有类似于 LD_LIBRARY_PATH 变量但在编译而不是运行时查找库的东西?我不想担心通过 L~/local/lib 或通过 ./configure 脚本中的标志将路径显式传递给编译器。

【问题讨论】:

    标签: unix shared-libraries


    【解决方案1】:

    有两种方法可以让库在运行时工作:

    1. 如果库仅供您使用,并且不是多用户系统,请使用 $LD_LIBRARY_PATH 环境变量

    2. 如果您是系统上的唯一用户,您可以将您的目录添加到 /etc/ld.so.conf,或添加到 /etc/ld.so.conf.d 中的新文本文件中。之后运行ldconfig重建系统的共享库缓存

    在编译时事情还不是很清楚。 GNU 链接器支持-rpath 参数和$LD_RUN_PATH 环境变量来指定库路径。然而,在每种情况下,结果路径最终都会硬编码在二进制文件中,因此如果您随后想要移动文件,则必须重新编译它们。

    我相信使用./configure 样式脚本构建的程序应该能够找到您的$LD_RUN_PATH 中的任何库,但无法对其进行测试。

    在任何一种情况下,运行 ./configure --prefix=${HOME}/local 都应该允许 configure 解析包含目录和库。

    【讨论】:

      【解决方案2】:

      LIBRARY_PATH 环境变量设置为$HOME/local/lib:$HOME/local/lib64。您还可以设置环境变量C_INCLUDE_PATHCPLUS_INCLUDE_PATH 来查找$HOME/local/include 中的包含文件。这些是 GCC 用来查找库和包含文件的环境变量,因此它们可能不适用于其他编译器。

      【讨论】:

      • 你是说 LD_LIBRARY_PATH 吗?
      • 没有。 LD_LIBRARY_PATH 用于加载库; GCC 使用 LIBRARY_PATH 来查找它们。
      • 哦,谢谢,这完全是最好的答案,我需要 $LIBRARY_PATH 来让 ld 找到库。谢谢!
      【解决方案3】:

      除了设置 LD_LIBRARY_PATH,您还可以查看 /etc/ld.so.conf(适用于所有用户,甚至是 root)。如果使用 /etc/ld.so.conf,还要考虑系统的安全性;如果人们从您的目录运行库,他们相信您不会惹恼他们。

      【讨论】:

        猜你喜欢
        • 2012-03-04
        • 2018-12-17
        • 2011-09-25
        • 2016-03-17
        • 2016-12-01
        • 1970-01-01
        • 2023-04-06
        • 2014-06-01
        • 1970-01-01
        相关资源
        最近更新 更多