特定平台信息
1 类 Unix 系统
FFmpeg 的部分代码无法用一些 AMD64 发行版仍在提供的 2.15 版 GNU 汇编器构建。要确认升级 binutils 后编译器确实使用了所需版本的 gas,请运行:
$(gcc -print-prog-name=as) --version
如果版本不对,应安装一个不硬编码 gas 路径的其他编译器。最坏情况下,可以向 configure 传入 --disable-asm。
1.1 高级链接配置
如果你静态编译了 FFmpeg 的库,并想用它们构建自己的共享库,可能需要强制启用 PIC 支持(在 FFmpeg configure 时加上 --enable-pic),并在项目的 LDFLAGS 中添加以下选项:
-Wl,-Bsymbolic
如果目标平台要求位置无关的可执行文件,应向 --extra-ldexeflags 传入正确的链接标志(例如 -pie)。
1.2 BSD
BSD 自带的 make 无法构建 FFmpeg,你需要安装并使用 GNU Make(gmake)。
1.3 (Open)Solaris
构建 FFmpeg 需要 GNU Make,因此要调用(gmake),标准的 Solaris Make 无法使用。用非 c99 前端(gcc 或一般的 suncc)构建时,由于 libc 默认不符合 c99,需要在 configure 选项中加上 --extra-libs=/usr/lib/values-xpg6.o 或 --extra-libs=/usr/lib/64/values-xpg6.o 之一。configure 执行的探测可能会因系统 shell 的一个缺陷而抛出异常,导致 configure 本身异常终止。直接调用 bash 等其他 shell 即可规避这个问题:
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 的 configure 就会自动找到它。
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 原生编译
FFmpeg 可以使用 MinGW-w64 工具链构建,从而在 Windows 上原生运行。从 http://msys2.github.io/ 和/或 http://mingw-w64.sourceforge.net/ 安装最新版本的 MSYS2 和 MinGW-w64。详细的安装说明可以在下载区和 FAQ 中找到。
注意事项:
- 不建议为 MSYS 环境构建,MSYS2 通过 mingw64_shell.bat 或 mingw32_shell.bat 提供了完整的 MinGW-w64 环境,应使用它们而不是 msys2_shell.bat 提供的环境。
- 使用 MSYS2 构建时,可以通过调用
make -r而不是普通的make来禁用 Makefile 中的隐式规则,从而加快速度。这种加速对于普通的一次性构建几乎没有效果,只有第二次运行 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.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++ Compiler
FFmpeg 可以用 MSVC 2013 或更高版本构建。
你需要以下前提条件:
要在 MSYS2 中搭建合适的环境,需要从 Visual Studio 或 Intel Compiler 的命令提示符中运行 msys_shell.bat。
把 nasm.exe 放到 PATH 中的某处。
接下来,确保你想使用的其他头文件和库(例如 zlib)都位于编译器可见的位置。为此,可以修改 LIB 和 INCLUDE 环境变量,加入指向这些目录的 Windows 风格 路径。另外,也可以尝试使用 --extra-cflags/--extra-ldflags 这两个 configure 选项。
最后,运行:
For MSVC:
./configure --toolchain=msvc
For ICL:
./configure --toolchain=icl
make
make install
如果你想编译共享库,请在 configure 选项中加上 --enable-shared。请注意,由于 MSVC 和 ICL 处理 DLL 导入/导出的方式,你无法同时编译静态库和共享库,启用共享库会自动禁用静态库。
注意事项:
- 如果你想构建带 zlib 支持的 FFmpeg,需要从某处获取一个兼容的 zlib 二进制文件(附带 MSVC 导入库),或者如果你想静态链接,可以按照下面的说明用 MSVC 构建一个兼容的
zlib.lib。无论使用哪种方法,都仍然必须执行步骤 3,否则编译会失败。- 获取 zlib 源码。
- 编辑
win32/Makefile.msc,使其使用 -MT 而不是 -MD,因为 FFmpeg 也是这样构建的。 - 编辑
zconf.h,移除其中对unistd.h的引入。构建 FFmpeg 时会错误地引入这个头文件。 - 运行
nmake -f win32/Makefile.msc。 - 把
zlib.lib、zconf.h和zlib.h移动到 MSVC 可见的位置。
- FFmpeg 已在 i686 和 x86_64 上使用以下环境测试过:
- Visual Studio 2013 Pro and Express
- Intel Composer XE 2013
- Intel Composer XE 2013 SP1
其他情况不受官方支持。
4.2.1 用 Microsoft Visual C++ 链接 FFmpeg
如果你打算链接 MSVC 构建的静态库,需要确保项目设置中的 Runtime Library 设为 Multi-threaded (/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 选项(Release 模式下默认启用)工作的导入库,请按以下步骤操作:
- 打开 Visual Studio 命令提示符。
或者,在普通的命令行提示符中调用 vcvars32.bat,即可设置 Visual C++ 工具所需的环境变量(这个文件的标准位置类似 C:\Program Files (x86_\Microsoft Visual Studio 10.0\VC\bin\vcvars32.bat)。
- 进入存放生成的 LIB 和 DLL 文件的 bin 目录。
- 用
lib.exe生成新的导入库:lib /machine:i386 /def:..\lib\foo-version.def /out:foo.lib
把 foo-version 和 foo 替换成对应的库名。
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
4.6 ARM64EC
FFmpeg 不打算支持 Windows 的 ARM64EC 构建配置;为 ARM64EC 目的而修改各个库的补丁不会被接受。
在这种构建配置下构建 FFmpeg 仍有可能是可行的;这样的构建看起来在某种程度上可以工作。不过这样的构建可能存在一定程度的 ABI 不一致,我们不打算修复这些问题。
(要让 aarch64 汇编代码严格支持 ARM64EC,需要对几乎所有此类汇编代码做条件编译或改动,这将带来巨大的维护负担。此外,为修复 ABI 不一致而改动库的 ABI 边界,可能需要广泛而侵入性的改动。)
主机托管由 telepoint.bg 提供