教程菜单 本页目录

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 添加到 configure 选项,因为默认情况下 libc 不符合 c99 标准。configure 执行的探测可能会引发异常,导致 configure 本身因系统 shell 中的错误而死亡。只需直接调用不同的 shell(如 bash)即可解决此问题:

bash ./configure

1.4 Darwin(Mac OS X、iPhone)

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

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

amd64 和 x86 上的 Mac OS X 需要 nasm 来构建大多数优化的汇编函数。Fink、Gentoo Prefix、Homebrew 或 MacPorts 可以轻松提供它。

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。您可以在下载部分和常见问题解答中找到详细的安装说明。

注意:

  • 不鼓励为 MSYS 环境构建,MSYS2 通过 mingw64_shell.batmingw32_shell.bat 提供完整的 MinGW-w64 环境,应使用该环境代替 msys2_shell.bat 提供的环境。
  • 通过调用 make -r 而不是普通 make 来禁用 Makefile 中的隐式规则,可以加快使用 MSYS2 构建的速度。对于正常的一次性构建,这种加速几乎不存在,只有在第二次运行 make 时才会明显(例如在 make install 期间)。
  • 为了编译 FFplay,您必须安装 MinGW 开发库 SDL 和 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 Shell 和 MinGW-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++ 编译器

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

您需要满足以下先决条件:

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

要在 MSYS2 中设置适当的环境,您需要从 Visual Studio 或 Intel 编译器命令提示符运行 msys_shell.bat。

将 yasm.exe 放在 PATH 中的某个位置。

接下来,确保您要使用的任何其他标头和库(例如 zlib)都位于编译器可以看到的位置。通过修改 LIB 和 INCLUDE 环境变量来包含这些目录的 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,否则编译将失败。
  • FFmpeg 已在 i686 和 x86_64 上进行了以下测试:

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

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

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

#define inline __inline

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

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

要创建与 /OPT:REF 选项(在发布模式下默认启用)配合使用的导入库,请按照以下步骤操作:

  1. 打开 Visual Studio 命令提示符。
  2. 进入 bin 已创建的 LIB 和 DLL 文件的存储目录。
  3. 使用 lib.exe 生成新的导入库:

4.3 Windows 与 Linux 的交叉编译

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

然后使用以下选项配置 FFmpeg:

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

(您可以根据为 MinGW 工具选择的前缀更改交叉前缀)。

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

4.4 在 Cygwin 下编译

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

使用所有“Base”软件包以及以下“Devel”软件包安装 Cygwin:

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

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

diffutils

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

libogg-devel, libvorbis-devel

这些库软件包仅可从 Cygwin Ports 获得:

yasm, 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
本页目录