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

pacman 装包只有一条命令,删包有三条,区别是「连坐」的范围。 -Rsc 会把「依赖你的包」一起删掉,删之前先看 Required By。

📝 本节和前面几节的关系

1.2.3 把环境更新好了,这一篇讲怎么往里装东西。 下一篇 1.2.5 就用这些命令装编 FFmpeg 要的依赖。

一、常用命令按危险程度排

装包的只有一条,删包的有三条,搜与查的各一条。 命令 作用 危险


pacman -S 包名 装 低 pacman -Ss 关键词 搜仓库 低 pacman -Qi 包名 看已装包的信息 低 pacman -Ql 包名 看这个包装了哪些文件 低 pacman -R 包名 只删这个包 中 pacman -Rs 包名 连带删没人再用的依赖 高 pacman -Rsc 包名 连同依赖它的包一起删 最高

-S 是 sync,-Q 是 query,-R 是 remove。 三个大写字母加小写修饰,就是 pacman 的全部语法。 -Ss 里的第二个 s 是 search,-Qi 的 i 是 info,-Ql 的 l 是 list。 记住这四组, 日常够用。

二、三级连坐:-R、-Rs、-Rsc 到底差在哪

这是 pacman 唯一会咬人的地方,必须拆开看。 假设依赖图是这样:ffmpeg 需要 x264、x265、aom、zlib、libass; 而 mpv、vlc、obs-studio 需要 ffmpeg。 命令 删掉谁 个数


-R ffmpeg 只有 ffmpeg 1 -Rs ffmpeg ffmpeg 加它需要的 7 个依赖 8 -Rsc ffmpeg 再加 mpv、obs-studio、vlc 11

区别在方向:-s 往下删(我需要的),-c 往上删(需要我的)。 -Rsc 两个方向都删,所以它删得最干净,也最容易误伤。 上面这三个数字是本课按真实依赖关系算出来的,本机没有 pacman,所以不是它真删的输出。 能验的是算法,验不了的是那次删除。

三、删之前先看 Required By

pacman -Qi 包名 的输出里有一行 Required By,那就是「谁依赖我」。 这一行不空,-Rsc 就会连坐;这一行是 None,删了也不会牵连别人。 Required By 含义 该用哪条


None 没人依赖它 -Rs 就够 列着一串包名 有包依赖它 别用 -Rsc

养成这个习惯比记住一百条命令值钱。 敲 -Rsc 之前多看一眼,能省掉重装整个环境的两个小时。

四、装的时候加 --needed,省一半时间

pacman -S --needed 包名:已装的自动跳过,不会重复下载。 不加这个参数,pacman 会把已装的包重新下载、重新解包一遍,看起来没事,实际白等。 脚本里一律加 --needed。 另一个常用参数是 --noconfirm,跳过所有交互确认。 写自动化脚本时用它,手动操作时别用——那正是你唯一能看清「要删什么」的机会。 本机验不了这些命令,因为 pacman 不在这台机器上(Demo 2 查过)。 这条限制会一直持续到本课讲完,凡涉及 MSYS2 的部分都是清单而非实测。

五、动手 Demo:Pacman 常用命令——哪几条会删东西,删多少

本机没有 pacman,调用它只会得到 FileNotFoundError。 真正跑的是「按依赖图算连坐范围」这一段。

dep = {"ffmpeg": ["x264", "x265", "aom", "zlib", "libass"]}   # 完整图见正文

def closure(root):        # 我需要的
    ...

def rev(root):            # 需要我的
    ...

print(len(closure("ffmpeg")), len(rev("ffmpeg")))

实跑输出:

--------------------------------------------------------------------
Pacman 常用命令——哪几条会删东西,删多少
--------------------------------------------------------------------

**① 常用命令,按危险程度排**

  命令                  作用                     危险
  -------------------------------------------------------
  pacman -S 包名        装                       低
  pacman -Ss 关键词     搜                       低
  pacman -Qi 包名       看已装包的信息           低
  pacman -Ql 包名       看这个包装了哪些文件     低
  pacman -R 包名        只删这个包,依赖留着     中
  pacman -Rs 包名       连带删没人再用的依赖     高
  pacman -Rsc 包名      连同依赖它的包一起删     最高

**② 本机执行:两条都告诉你「没有这个命令」**

`pacman -Q` → FileNotFoundError:WinError 2,系统里没有这个可执行文件
`pacman -Ss ffmpeg` → FileNotFoundError:WinError 2,系统里没有这个可执行文件

**③ 真问题在 -Rsc:它会把「依赖你的包」也删掉**

下面这张依赖图是本课按 MSYS2 的真实依赖关系画的。
要算的是:删掉 `mingw-w64-x86_64-ffmpeg`,`-Rsc` 会连带带走谁。

  命令            会删掉的包                                                    个数
  --------------------------------------------------------------------------------------
  -R ffmpeg       ffmpeg                                                        1
  -Rs ffmpeg      ffmpeg + aom、freetype、fribidi、libass、x264、x265、zlib     8
  -Rsc ffmpeg     再加上 mpv、obs-studio、vlc                                   11

**一个 `-Rs` 会带走 8 个包,一个 `-Rsc` 会带走 11 个**——后者连 mpv、vlc、obs-studio 一起删,
因为它们是「依赖 ffmpeg 的」。

**④ 所以删之前先问一句**

`pacman -Qi 包名` 里有一行 `Required By`,那一行就是「谁依赖我」。它不空,`-Rsc` 就会连坐。
**养成先看 Required By 再动手的习惯,比记住一百条命令值钱。**

**⑤ 本课的实测结论**:本机没有 pacman,所以上面三行数字是在这张图上算出来的,
不是 pacman 真删的输出。
图里的包名取自 MSYS2 真实仓库,依赖关系也一样——**能验的是算法,验不了的是那次删除**。

一个 -Rs 带走 8 个包,一个 -Rsc 带走 11 个。 差的三个是 mpv、obs-studio、vlc——它们是「依赖 ffmpeg 的」。

30 秒实验

  1. pacman -Qi 某个包 | grep "Required By",看这一行是不是 None。
  2. 拿本节的依赖图,手工算一遍 -Rs x264 会删几个包,再和代码结果对一下。
  3. pacman -Ql 包名 | head 看一个包往磁盘上放了哪些文件。

常见误区

  1. 习惯性用 -Rsc 删包。 它会把依赖这个包的软件一起删,删 ffmpeg 顺带删掉播放器和直播软件。
  2. 删之前不看 Required By。 这一行是唯一的警告,就在 -Qi 的输出里。
  3. 以为 -R 会把依赖一起删。 它只删指定的包,依赖留在磁盘上变成孤儿。
自测三问(点开对答案) 1. `-Rs` 与 `-Rsc` 的区别是什么? —— `-s` 往下删(这个包需要的依赖),`-c` 往上删(需要这个包的软件)。`-Rsc` 两个方向都删。 2. 怎么提前知道删某个包会不会牵连别人? —— `pacman -Qi 包名` 里的 Required By 一行。它列着包名就说明有人依赖它。 3. 脚本里为什么建议加 `--needed`? —— 已装过的包会被跳过,不重复下载解包,省时间且避免覆盖本地改动。

相关笔记