🎬 第一章 编译FFmpeg源码并搭建开发环境
📄 一句话概括

编 FFmpeg 要装的不止六七个包,落地会把传递依赖一起带进来。 装完还找不到命令,九成是那一层的 bin 没进 PATH。

📝 本节和前面几节的关系

1.2.4 讲了 pacman 怎么用,这一篇就用它装东西。 装完依赖,1.2.6 与 1.2.7 才能开始 configure。

一、依赖分三类,缺一类编不出完整产物

教材那条命令看着杂,其实是三类东西。 类 包 缺了会怎样


构建工具 make diffutils configure 直接跑不起来 查找工具 pkg-config 找不到外部库,功能被静默关掉 汇编器 yasm nasm x264 编不过,报汇编语法错 编译器 gcc(mingw-w64 版) make 阶段全部失败

第二类是隐蔽的:缺 pkg-config 不会让 configure 失败,它只会报告「找不到 libx264」, 然后把 x264 支持关掉——你编完得到一个能跑但不会 H.264 编码的 FFmpeg,没有任何报错提醒你。 判断有没有被静默关掉,看 configure 结尾那段清单。 Enabled encoders: 里没有 libx264, 就是它没找到。

二、一条命令,落地多少个包

pacman -S make diffutils yasm nasm pkg-config gcc 是六个包。 但 gcc 自己就依赖 binutils、mingw-w64-crt、isl、mpc、mpfr,pkg-config 依赖 glib2, glib2 又依赖 libiconv 与 pcre2……装完一算,是十七个。 项 值


命令里写的 6 个 实际落地 17 个(另有 11 个传递依赖) 多出来的 binutils glib2 gmp isl libiconv mpc 等

这就是包管理器的意义:你只说「我要 gcc」,它自己把 gcc 需要的东西补齐。 手工下载 zip 包的人,往往卡在「为什么 ld 找不到」——因为 binutils 没装。 装完腾出多少磁盘,也可以先看一眼: pacman -S --print 会把要下的包列出来,先看看再确认, 比装完再删省事。

三、装完了还找不到命令:PATH 那一段

最常见的一句疑问是「我明明装了 gcc,为什么 gcc 说不认识」。 因为包装进了 /ucrt64/bin,而那个目录不在当前窗口的 PATH 里——装的层与用的层不是一个。 本机 PATH 的真实结构: 36 段,其中 18 段里有可执行文件。 项 值 说明


PATH 段数 36 环境变量里被分号切开后的段数 含 exe 的段 18 真正能命中命令的那些 编 FFmpeg 需要 1 只需要那一个 mingw64 或 ucrt64 的 bin

三十六段里只要一段对就行,但那一段必须对。 判断方法:which gcc,回的路径里带 msys64 前缀才算对。 别用系统属性去改 PATH。 MSYS2 那三个窗口各自带自己的 PATH,改系统变量只会把三套混到一起, 越改越乱。

四、验证清单:四条命令

序 命令 期望


1 make --version GNU Make 4.x 2 gcc --version gcc 版本号 3 yasm --version yasm 版本号 4 pkg-config --version 0.2x 以上

四条都过,再去 git clone 源码。 少一条就先去补, 不要抱着「试试看能不能编」的心态——configure 跑到一半会因为缺 yasm 停下,那时候你已经等了十分钟。 本机四条全过不了,因为这台机器没 MSYS2,也没这四样东西。清单是真的,执行需要另一台机器。

五、动手 Demo:装依赖项——一条命令背后装了多少个包

本机没有 pacman,所以这一段做的是「按依赖图算传递闭包」。 图里的包名与依赖关系取自 MSYS2 真实仓库。

gg = {"gcc": ["binutils", "mingw-w64-crt", "isl", "mpc", "mpfr"]}   # 完整图见正文
want = ["make", "diffutils", "yasm", "nasm", "pkg-config", "gcc"]

seen, stack = set(), list(want)
while stack:
    n = stack.pop()
    if n in seen: continue
    seen.add(n)
    stack.extend(gg.get(n, []))
print(len(want), len(seen))

实跑输出:

--------------------------------------------------------------------
装依赖项——一条命令背后装了多少个包
--------------------------------------------------------------------

**① 编 FFmpeg 5.0 要装的东西,分三类**

  类           包                            为什么
  -----------------------------------------------------------------------------
  构建工具     make diffutils pkg-config     configure 与 Makefile 全靠它们
  汇编器       yasm nasm                     libx264 的汇编内核要用
  编译器       gcc (mingw-w64 交叉)          真正的编译动作

教材那条命令是 `pacman -S make diffutils yasm nasm pkg-config gcc`,看着六七个包,
实际装进来的远不止。

**② 算一遍传递依赖**

  项             值
  ---------------------------------------------------------------------
  要装的包       6 个
  实际落地       17 个(含 11 个传递依赖)
  传递依赖一     binutils、glib2、gmp、isl、libiconv、mingw-w64-crt
  传递依赖二     mpc、mpfr、msys2-runtime、pcre2、zlib

**六条命令,落地 17 个包**,多出来的 11 个全是依赖:binutils、gmp、mpfr、mpc、
isl 这一串谁也没写在命令里。

**③ 本机的 PATH 有 36 段,里面有可执行文件的 18 段**

MSYS2 那台机器上,`gcc --version` 之所以能找到,是因为 `/mingw64/bin` 在 PATH 里。
**装完包还找不到命令,九成是这一段没进去。**

**④ 一条命令验完**

`pacman -S --needed make diffutils yasm nasm pkg-config gcc` 加个 `--needed`,已装的会自动跳过,
不会重复下载。这比「先 -Q 一个个查再装」省事得多。

六条命令,落地 17 个包。 多出来的 11 个全是传递依赖,谁也没写在命令里。

30 秒实验

  1. pacman -Si gcc 看 gcc 的 Depends On 那一行,数出几个直接依赖。
  2. echo $PATH | tr ':' '\n' | grep msys64 看 MSYS2 的路径有没有进 PATH。
  3. pacman -Q | wc -l 数一下环境里一共装着多少个包。

常见误区

  1. 只装 gcc 不装 make 与 diffutils。 configure 是脚本,跑它要 make 与 diff 的底层工具。
  2. 缺 pkg-config 却以为没事。 它不在时外部库会被静默关掉,编出来的 FFmpeg 少一堆编码器,还不报错。
  3. 用系统属性改 PATH。 MSYS2 那三个窗口各带自己的 PATH,改系统变量会把三套混在一起。
自测三问(点开对答案) 1. 缺 pkg-config 会有什么症状? —— configure 不报错,但会报告找不到 libx264 这类外部库,把对应支持关掉。产物能跑,只是少了编码器。 2. 为什么装六个包会落地十七个? —— 包管理器会把依赖一起装。gcc 依赖 binutils、crt、isl、mpc、mpfr,pkg-config 依赖 glib2,glib2 再依赖别的。 3. 装了 gcc 却提示找不到命令,先查什么? —— 查当前窗口的 PATH 里有没有那一层的 bin,用 which gcc 看路径前缀。

相关笔记