我们如何确定 ffmpeg 所需的依赖项

How do we determine the required dependencies for ffmpeg

我已经在 ubuntu 上安装了 ffmpeg。我打算将编译好的ffmpeg和所需的依赖项复制到一个目录中,然后将该目录复制到另一台机器上。这样我们就可以在另一台机器上 运行 ffmpeg 而无需安装。我们如何确定复制所需的依赖项?在此页面上看到说明:https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu,但它没有解释 ffmpeg 所需的依赖项。

当我使用 ldd ffmpeg 时,我得到了类似的东西:

    linux-vdso.so.1 (0x00007fffe20fd000)
    libavdevice.so.58 => /lib/x86_64-linux-gnu/libavdevice.so.58 (0x00007fc116e90000)
    libavfilter.so.7 => /lib/x86_64-linux-gnu/libavfilter.so.7 (0x00007fc116b10000)
    libavformat.so.58 => /lib/x86_64-linux-gnu/libavformat.so.58 (0x00007fc116890000)
    libavcodec.so.58 => /lib/x86_64-linux-gnu/libavcodec.so.58 (0x00007fc1152d0000)
    libavresample.so.4 => /lib/x86_64-linux-gnu/libavresample.so.4 (0x00007fc1152a0000)
    libpostproc.so.55 => /lib/x86_64-linux-gnu/libpostproc.so.55 (0x00007fc115270000)

这些是必需的依赖项吗?它没有列出 bin、include 或 share 文件夹下的文件。

这可能不是构建可移植二进制文件的最佳方式。

您看到的是库依赖项,但请注意:

  • 这个库中的每一个都有自己的依赖项,您也需要跟踪和复制这些依赖项;
  • 它们可能与目标机器上的库版本冲突,需要您使用技巧(如设置 LD_LIBRARY_PATH)加载正确版本的库;
  • 您仍然会丢失任何非 lib 依赖项(例如配置文件)。

此外,仅将所有这些库复制到另一台机器并不能保证它们会 运行 在那里,除非它使用相同的发行版。例如,它们可能是为不同的 glibc 目标构建的。

一些更好的方法是:

  1. 改为构建一个完全静态的二进制文件: 这通常可以通过在编译时添加“-static”作为 LDFLAGS 环境变量的第一个参数来实现。您将需要拥有或构建 ffmpeg 所依赖的所有库的静态版本。一些发行版提供静态库版本,而另一些则不提供,因此,请准备好自己构建所有库。 生成的二进制文件将包含所有捆绑的依赖项,并且应该 运行 无处不在 (1)

  2. Install/Build chroot下的软件: 您可以安装一些发行版的最小 chroot,并在那里构建您需要的一切。 然后你可以在其他机器上移动 chroot,它应该可以在任何地方工作 (1)。 以下是获得最小 Gentoo chroot 的说明:https://wiki.gentoo.org/wiki/Chroot

  3. 尝试使用 ELF Statifier 工具: 这些并不总是适用于所有应用程序,但值得一试。 他们会做一些肮脏的工作来找到所有共享的 lib 依赖项并将它们全部捆绑到一个二进制文件中: http://statifier.sourceforge.net/

(1) - 任何地方都意味着与您的构建机器相同的架构和相同或更高的内核版本。 如果您想更进一步并创建一个与(很多)旧内核兼容的静态二进制文件,您还需要构建 glibc 设置“--enable-kernel=version”配置开关。

看来您只是想在机器之间移动某种离线文件。 您考虑过使用 snap 吗?

您可以使用以下命令在一台机器上下载快照:

snap download ffmpeg

这将生成2个文件,要安装到另一台机器上,只需复制它们然后运行:

  snap ack ffmpeg_1286.assert
  snap install ffmpeg_1286.snap