【问题标题】:Is /usr/local/lib searched for shared libraries?是否在 /usr/local/lib 中搜索共享库?
【发布时间】:2011-06-12 05:01:36
【问题描述】:

/usr/local/lib 是否搜索共享库?我有这个错误:

[Leo@chessman ~]$ whereis ffmpeg
ffmpeg: /usr/local/bin/ffmpeg
[Leo@chessman ~]$ ffmpeg
ffmpeg: error while loading shared libraries: libavcore.so.0: cannot open shared object file: No such file or directory
[Leo@chessman ~]$ ls /usr/local/lib/libav*
/usr/local/lib/libavcodec.a            /usr/local/lib/libavfilter.a
/usr/local/lib/libavcodec.so           /usr/local/lib/libavfilter.so
/usr/local/lib/libavcodec.so.52        /usr/local/lib/libavfilter.so.1
/usr/local/lib/libavcodec.so.52.108.0  /usr/local/lib/libavfilter.so.1.74.0
/usr/local/lib/libavcore.a             /usr/local/lib/libavformat.a
/usr/local/lib/libavcore.so            /usr/local/lib/libavformat.so
/usr/local/lib/libavcore.so.0          /usr/local/lib/libavformat.so.52
/usr/local/lib/libavcore.so.0.16.1     /usr/local/lib/libavformat.so.52.94.0
/usr/local/lib/libavdevice.a           /usr/local/lib/libavutil.a
/usr/local/lib/libavdevice.so          /usr/local/lib/libavutil.so
/usr/local/lib/libavdevice.so.52       /usr/local/lib/libavutil.so.50
/usr/local/lib/libavdevice.so.52.2.3   /usr/local/lib/libavutil.so.50.36.0
[Leo@chessman ~]$ 

【问题讨论】:

    标签: linux linker ffmpeg shared-libraries


    【解决方案1】:

    确保您的LD_LIBRARY_PATH 设置为包含您要搜索的所有目录,然后再次对其进行测试。

    您可以通过以下方式快速测试:

    LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib ffmpeg
    

    这将只为该调用设置它。

    或者,您可以编辑包含默认搜索目录的/etc/ld.so.conf。某些 Linux 发行版可能不会在该文件中包含 /usr/local/lib

    请注意,您可能还需要通过运行 ldconfig(以 root 身份或使用 sudo)来更新缓存 /etc/ld.so.cache

    【讨论】:

    • @paxdiablo 优秀的解决方案! export LD_LIBRARY_PATH=/usr/local/lib/ 我刚刚花了几个小时寻找这个解决方案。在启用 X264 的 Ubuntu 10.10 上运行良好。
    【解决方案2】:

    来自http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html

    GNU 标准建议在分发源代码时将所有库默认安装在 /usr/local/lib 中(并且所有命令都应该进入 /usr/local/bin)。

    ...

    要搜索的目录列表存储在文件/etc/ld.so.conf 中。许多 Red Hat 派生的发行版通常不在 /etc/ld.so.conf 文件中包含 /usr/local/lib。我认为这是一个错误,将 /usr/local/lib 添加到 /etc/ld.so.conf 是在 Red Hat 派生系统上运行许多程序所需的常见“修复”。

    在 Debian 上,/etc/ld.so.conf 包含 include /etc/ld.so.conf.d/*.conf/etc/ld.so.conf.d/libc.conf 包含

    # libc default configuration
    /usr/local/lib
    

    【讨论】:

      【解决方案3】:

      是与否

      程序有一个编译入(好的,“链接入”)的想法,知道在哪里可以找到它们的库。如果一个程序期望在/usr/local/lib 中找到它的库,那么它会。

      还有一个名为ldconfig 的程序和一个名为/etc/ld.so.conf 的配置文件,很可能是/etc/ld.so.conf.d,它们用于指定特定于站点的目录。

      阅读“man ld.so”,其中列出了环境变量LD_LIBRARY_PATH等其他旋钮。

      LD.SO(8)                   Linux Programmer’s Manual                  LD.SO(8)
      
      NAME
             ld.so, ld-linux.so* - dynamic linker/loader
      
      DESCRIPTION
             The  programs ld.so and ld-linux.so* find and load the shared libraries
             needed by a program, prepare the program to run, and then run it.
      . . .
      

      ...和...

      LDCONFIG(8)                Linux Programmer’s Manual               LDCONFIG(8)
      
      NAME
             /sbin/ldconfig - configure dynamic linker run time bindings
      
      SYNOPSIS
             /sbin/ldconfig  [  -nNvXV ] [ -f conf ] [ -C cache ] [ -r root ] direc-
             tory ...
             /sbin/ldconfig -l [ -v ] library ...
             /sbin/ldconfig -p
      
      DESCRIPTION
             ldconfig creates the necessary links  and  cache  to  the  most  recent
             shared  libraries  found  in  the  directories specified on the command
             line, in the file /etc/ld.so.conf, and in the trusted directories (/lib
             and  /usr/lib).  The cache is used by the run-time linker, ld.so or ld-
             linux.so.  ldconfig checks the header and filenames of the libraries it
             encounters  when  determining  which  versions  should have their links
             updated.
      . . .
      

      【讨论】:

        【解决方案4】:

        find / -name 'libavdevice.so.*' 了解此库是否可用。

        sudo gedit /etc/ld.so.conf

        添加这些行并保存:

        include /usr/local/lib
        include /usr
        

        ldconfig

        【讨论】:

        • 必须要用include这个词吗?
        • "include" 保留用于从文件导入。在许多发行版中,/etc/ld.so.conf 的默认内容是include /etc/ld.so.conf.d/*.conf,如果您查看/etc/ld.so.conf.d/ 目录,您会看到列出实际库路径的文本文件。对列出库的文件使用“include”,并使用 /usr/local/lib 等不带“include”的直接路径。
        【解决方案5】:

        IIRC,ld.so 使用文件 /etc/ld.so.conf 列出目录以搜索共享对象。您也可以使用环境变量LD_LIBRARY_PATH

        Linux 上的 ELF 标头也可能包含 RPATH 条目。检查 RPATH 条目运行

        readelf -d ffmpeg | grep RPATH
        

        您可能不会从中得到任何结果。要在编译时设置 RPATH:

        gcc ... -wl, -rpath=MY_PATH
        

        如果你想要执行目录使用\$ORIGIN

        某些程序,例如 chrpath,允许您编辑现有二进制文件的 RPATH。

        注意:任何带有 setuid 的程序都不会使用LD_LIBRARY_PATH,因为它存在安全风险。

        【讨论】:

          【解决方案6】:

          这个老问题的另一个选择是使用 LD_RUN_PATH。

          export LD_RUN_PATH=/usr/local/lib
          

          然后再次编译:

          make
          make install
          ldconfig
          

          比使用 LD_LIBRARY_PATH 更好。来自@cweiske linuxmafia.com/faq/Admin/ld-lib-path.html的原始参考

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-02-23
            • 2012-08-16
            • 2013-07-21
            • 2014-07-17
            • 1970-01-01
            • 1970-01-01
            • 2013-07-27
            相关资源
            最近更新 更多