13

我用 librtmp 构建了 ffmpeg。我的 librtmp 位于 /opt/librtmp/lib。当我执行ffmpeg时,它说:

./ffmpeg: error while loading shared libraries: librtmp.so.0: cannot open shared object file: No such file or directory

我使用 ldd 命令显示未找到

[qty@testing bin]# ldd ffmpeg 
        linux-vdso.so.1 =>  (0x00007fff15576000)
        librtmp.so.0 => not found
        libz.so.1 => /lib64/libz.so.1 (0x00002b9a71e10000)
        libm.so.6 => /lib64/libm.so.6 (0x00002b9a72025000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00002b9a722a8000)
        libc.so.6 => /lib64/libc.so.6 (0x00002b9a724c3000)
        /lib64/ld-linux-x86-64.so.2 (0x00002b9a71bf2000)

我知道我是这样的:

[qty@testing bin]# ls -alh  /opt/librtmp/lib/
total 300K
drwxr-xr-x 3 root root 4.0K Sep 25 17:10 .
drwxr-xr-x 7 root root 4.0K Sep 25 17:10 ..
-rw-r--r-- 1 root root 158K Sep 25 17:10 librtmp.a
lrwxrwxrwx 1 root root   12 Sep 25 17:10 librtmp.so -> librtmp.so.0
-rwxr-xr-x 1 root root 118K Sep 25 17:10 librtmp.so.0
drwxr-xr-x 2 root root 4.0K Sep 25 17:10 pkgconfig

我找到了几种解决问题的方法

  • 修改/etc/ld.so.conf,但需要超级用户
  • 设置 LD_LIBRARY_PATH 变量,但对用户不方便
  • 像这样将 rpath 传递给 gcc

为我的 ffmpeg 配置参数

PKG_CONFIG_PATH="/opt/librtmp/lib/pkgconfig" ./configure --disable-doc \
--disable-ffserver --disable-avdevice \
--disable-postproc --disable-avfilter --disable-bsfs \
--disable-filters \
--disable-asm \
--disable-bzlib \
--enable-librtmp \
--prefix=/opt/ffmpeg \
--extra-ldflags="-Wl,-rpath,/opt/librtmp/lib"

假设没有源代码要重新编译?如何将共享库搜索路径添加到可执行文件?

4

4 回答 4

8

我意识到 OP 可能已经继续前进,但这是 NixOS 经常做的事情,他们已经为这个问题发布了一个工具。这也是我在听说 NixOS 之前遇到的一个问题。

这是他们工具的示例用法patchelf

...同样,您可以更改 RPATH,即嵌入到可执行文件和动态库中的链接器搜索路径:

patchelf --set-rpath /opt/my-libs/lib:/foo/lib program

这会导致动态链接器搜索/opt/my-libs/lib程序/foo/lib所需的共享库...。

来自https://nixos.org/patchelf.html

于 2016-02-15T10:15:28.003 回答
3

您可以使用addrpath将 RPATH 添加到您的 elf 文件中。

RPATH 将像 LD_LIBRARY_PATH 一样工作,即告诉动态加载程序在该路径中搜索共享库。RPATH 将永久保存在您的 ELF 文件中。

于 2012-10-06T00:51:08.840 回答
3

尼克斯

可能是 nixos 特定的,但提供了关于 ldd/patchelf 的有趣见解:

https://lastlog.de/blog/posts/playing_FTL_on_NIXOS.html

ubuntu

在 ubuntu/fedora 上,您将使用:LD_LIBRARY_PATH使用启动脚本./ftl,再次,请参阅我上面关于 FTL 及其部署方式的帖子。

于 2016-02-27T15:44:44.657 回答
1

我对这个问题的解决方法是将 librtmp 安装到 /usr/local/lib 并在安装后运行“sudo ldconfig”。然后可以通过添加 --enable-librtmp 来简单地配置 Ffmpeg。对我来说,这很好用:无需修改系统!

于 2013-07-31T09:44:33.200 回答