平台特定信息

目录

1 类 Unix

FFmpeg 的某些部分无法使用 GNU 汇编器 2.15 版本构建,该版本仍由一些 AMD64 发行版提供。要确保在 binutils 升级后,您的编译器确实使用了所需版本的 gas,请运行

$(gcc -print-prog-name=as) --version

如果不是,那么您应该安装一个没有硬编码 gas 路径的不同编译器。在最坏的情况下,将 --disable-asm 传递给 configure。

1.1 高级链接配置

如果您静态编译了 FFmpeg 库,并且您想使用它们来构建您自己的共享库,您可能需要强制 PIC 支持(在 FFmpeg 配置期间使用 --enable-pic)并将以下选项添加到您的项目 LDFLAGS

-Wl,-Bsymbolic

如果您的目标平台需要位置无关的可执行文件,您应该将正确的链接标志(例如 -pie)传递给 --extra-ldexeflags

1.2 BSD

BSD make 不会构建 FFmpeg,您需要安装并使用 GNU Make (gmake)。

1.3 (Open)Solaris

构建 FFmpeg 需要 GNU Make,因此您必须调用(gmake),标准的 Solaris Make 将不起作用。当使用非 c99 前端(gcc、通用 suncc)构建时,请将 --extra-libs=/usr/lib/values-xpg6.o--extra-libs=/usr/lib/64/values-xpg6.o 添加到配置选项,因为 libc 默认情况下不符合 c99 标准。由于系统 shell 中的一个错误,configure 执行的探测可能会引发异常,导致 configure 本身终止。只需直接调用不同的 shell(例如 bash)即可解决此问题。

bash ./configure

1.4 Darwin (Mac OS X, iPhone)

Xcode 提供的工具链足以构建基本的非加速代码。

PowerPC 或 ARM (iPhone) 上的 Mac OS X 需要来自 https://github.com/FFmpeg/gas-preprocessorhttps://github.com/yuvi/gas-preprocessor (目前已过时)的预处理器来构建优化的汇编函数。将 Perl 脚本放在您 PATH 中的某个位置,FFmpeg 的 configure 将自动拾取它。

amd64 和 x86 上的 Mac OS X 需要 nasm 来构建大多数优化的汇编函数。 FinkGentoo PrefixHomebrewMacPorts 可以轻松提供它。

2 DOS

由于各种原因,首选使用交叉编译器。 http://www.delorie.com/howto/djgpp/linux-x-djgpp.html

3 OS/2

有关在 OS/2 上编译 FFmpeg 的信息,请参阅 http://www.edm2.com/index.php/FFmpeg

4 Windows

4.1 使用 MinGW 或 MinGW-w64 的原生 Windows 编译

可以使用 MinGW-w64 工具链构建 FFmpeg 以在 Windows 上原生运行。从 http://msys2.github.io/ 和/或 http://mingw-w64.sourceforge.net/ 安装最新版本的 MSYS2 和 MinGW-w64。您可以在下载部分和 FAQ 中找到详细的安装说明。

注意

  • 不建议为 MSYS 环境构建,MSYS2 通过 mingw64_shell.batmingw32_shell.bat 提供了一个完整的 MinGW-w64 环境,应该使用该环境代替 msys2_shell.bat 提供的环境。
  • 通过在 Makefile 中禁用隐式规则,可以通过调用 make -r 而不是普通的 make 来加快使用 MSYS2 的构建速度。对于正常的一次性构建,这种加速几乎不存在,只有在第二次运行 make 时(例如在 make install 期间)才会被注意到。
  • 为了编译 FFplay,您必须安装 SDL 的 MinGW 开发库和 pkg-config
  • 通过在配置 FFmpeg 时使用 ./configure --enable-shared,您可以将 FFmpeg 库(例如 libavutil、libavcodec、libavformat)构建为 DLL。

4.1.1 使用 MSYS2 的原生 Windows 编译

MSYS2 MinGW-w64 环境通过 pacman 提供即用型工具链和依赖项。

确保使用 mingw64_shell.batmingw32_shell.bat 来获得正确的 MinGW-w64 环境。默认安装在 MinGW-w64 Win64 ShellMinGW-w64 Win32 Shell 下提供了它们的快捷方式。

# normal msys2 packages
pacman -S make pkgconf diffutils

# mingw-w64 packages and toolchains
pacman -S mingw-w64-x86_64-nasm mingw-w64-x86_64-gcc mingw-w64-x86_64-SDL2

要定位 32 位,请在上面的命令中将 x86_64 替换为 i686

4.2 用于 Windows 的 Microsoft Visual C++ 或 Intel C++ 编译器

可以使用 MSVC 2013 或更高版本构建 FFmpeg。

您需要以下先决条件

  • MSYS2
  • NASM (也可以通过 MSYS2 的包管理器获得。)

要在 MSYS2 中设置正确的环境,您需要从 Visual Studio 或 Intel Compiler 命令提示符运行 msys_shell.bat

nasm.exe 放置在您 PATH 中的某个位置。

接下来,确保您要使用的任何其他头文件和库(例如 zlib)都位于编译器可以看到的位置。通过修改 LIBINCLUDE 环境变量以包含这些目录的Windows 样式路径来完成此操作。或者,您可以尝试使用 --extra-cflags/--extra-ldflags 配置选项。

最后,运行

For MSVC:
./configure --toolchain=msvc

For ICL:
./configure --toolchain=icl

make
make install

如果您希望编译共享库,请将 --enable-shared 添加到您的配置选项。请注意,由于 MSVC 和 ICL 处理 DLL 导入和导出的方式,您不能同时编译静态库和共享库,启用共享库将自动禁用静态库。

注意

  • 如果您希望构建对 zlib 的支持,您将必须从某个地方获取兼容的 zlib 二进制文件,其中包含 MSVC 导入库,或者如果您希望静态链接,您可以按照以下说明使用 MSVC 构建兼容的 zlib.lib。无论您使用哪种方法,您都必须仍然执行步骤 3,否则编译将失败。
    1. 获取 zlib 源代码
    2. 编辑 win32/Makefile.msc,使其使用 -MT 而不是 -MD,因为这也是 FFmpeg 的构建方式。
    3. 编辑 zconf.h 并删除其对 unistd.h 的包含。这会在构建 FFmpeg 时被错误地包含。
    4. 运行 nmake -f win32/Makefile.msc
    5. zlib.libzconf.hzlib.h 移动到 MSVC 可以看到的位置。
  • FFmpeg 已在 i686 和 x86_64 上使用以下内容进行了测试
    • Visual Studio 2013 Pro 和 Express
    • Intel Composer XE 2013
    • Intel Composer XE 2013 SP1

    其他任何内容均未获得官方支持。

4.2.1 使用 Microsoft Visual C++ 链接到 FFmpeg

如果您计划与 MSVC 构建的静态库链接,则需要确保在项目的设置中将“运行时库”设置为“多线程 (/MT)”。

您需要将 inline 定义为 MSVC 可以理解的内容

#define inline __inline

另请注意,如Microsoft Visual C++中所述,您需要与 MSVC 兼容的 inttypes.h

如果您计划使用 dlltool 创建的导入库,您必须在链接器优化设置下将“引用”设置为“否 (/OPT:NOREF)”,否则生成的二进制文件将在运行时失败。使用 lib.exe 生成的导入库不需要这样做。此问题已在上游报告,网址为 http://sourceware.org/bugzilla/show_bug.cgi?id=12633

要创建与 /OPT:REF 选项(在 Release 模式下默认启用)一起使用的导入库,请执行以下步骤

  1. 打开Visual Studio 命令提示符

    或者,在普通的命令行提示符中,调用 vcvars32.bat,它会为 Visual C++ 工具设置环境变量(此文件的标准位置类似于 C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\vcvars32.bat)。

  2. 进入存储已创建的 LIB 和 DLL 文件的 bin 目录。
  3. 使用 lib.exe 生成新的导入库。
    lib /machine:i386 /def:..\lib\foo-version.def  /out:foo.lib
    

    foo-versionfoo 替换为相应的库名称。

4.3 使用 Linux 为 Windows 进行交叉编译

您必须使用位于 http://www.mingw.org/ 的 MinGW 交叉编译工具。

然后使用以下选项配置 FFmpeg

./configure --target-os=mingw32 --cross-prefix=i386-mingw32msvc-

(您可以根据为 MinGW 工具选择的前缀更改 cross-prefix)。

然后,您可以使用 Wine 轻松测试 FFmpeg。

4.4 在 Cygwin 下编译

请使用 Cygwin 1.7.x,因为过时的 1.5.x Cygwin 版本在其 C 库中缺少 llrint()。

安装 Cygwin 时,请安装所有 “Base” 包,以及以下 “Devel” 包

binutils, gcc4-core, make, git, mingw-runtime, texinfo

为了运行 FATE,您还需要以下 “Utils” 包

diffutils

如果您想使用其他库构建 FFmpeg,请从任何 Cygwin 包存储库下载 Ogg 和 Vorbis 的 Cygwin “Devel” 包

libogg-devel, libvorbis-devel

这些库包仅可从 Cygwin Ports 获得

libSDL-devel, libgsm-devel, libmp3lame-devel,
speex-devel, libtheora-devel, libxvidcore-devel

对于 x264,建议从源代码构建,因为它更新太快,Cygwin Ports 无法保持最新。

4.5 在 Cygwin 下为 Windows 进行交叉编译

使用 Cygwin,您可以创建不需要 cygwin1.dll 的 Windows 二进制文件。

只需按照之前的说明安装 Cygwin,再加上这些额外的 “Devel” 包

gcc-mingw-core, mingw-runtime, mingw-zlib

并在您的 configure 调用中添加一些特殊标志。

对于静态构建,运行

./configure --target-os=mingw32 --extra-cflags=-mno-cygwin --extra-libs=-mno-cygwin

对于使用共享库的构建,运行

./configure --target-os=mingw32 --enable-shared --disable-static --extra-cflags=-mno-cygwin --extra-libs=-mno-cygwin

本文档于 2025 年 1 月 21 日 使用 makeinfo 生成。

telepoint.bg 提供托管。