我使用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命令显示 not found :
[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
我找到了几种解决问题的方法
为我的ffmpeg配置args
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"
假设没有源代码重新编译?如何将共享库搜索路径添加到可执行文件?
答案 0 :(得分:5)
我意识到OP可能已经开始了,但这是NixOS经常做的事情,他们已经为这个问题发布了一个工具。这也是我在听到NixOS之前遇到的一个问题。
以下是其工具patchelf
... 同样,您可以更改RPATH,嵌入到可执行文件和动态库中的链接器搜索路径:
patchelf --set-rpath /opt/my-libs/lib:/foo/lib program
这会导致动态链接器在/opt/my-libs/lib
和/foo/lib
中搜索程序所需的共享库....
答案 1 :(得分:3)
您可以使用addrpath将RPATH添加到您的精灵文件中。
RPATH将像LD_LIBRARY_PATH一样工作,即告诉动态加载程序搜索该路径中的共享库。 RPATH将永久保存在您的ELF文件中。
答案 2 :(得分:1)
我对此问题的解决方法是将librtmp安装到/ usr / local / lib并在安装后运行'sudo ldconfig'。 然后可以通过添加--enable-librtmp简单地配置Ffmpeg。 对我来说这很好用:不需要进行系统修改!
答案 3 :(得分:1)
这个可能是nixos特定的,但提供了有关ldd / patchelf的有趣见解:
https://lastlog.de/blog/posts/playing_FTL_on_NIXOS.html
在ubuntu / fedora上你会使用:LD_LIBRARY_PATH
和一个起始脚本./ftl
,再看看我上面关于FTL及其部署方式的帖子。