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.bat 或 mingw32_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.bat 或 mingw32_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 选项(在发布模式下默认启用)配合使用的导入库,请按照以下步骤操作:
- 打开 Visual Studio 命令提示符。
- 进入 bin 已创建的 LIB 和 DLL 文件的存储目录。
- 使用 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