🎬 第十一章 SRS搭建直播平台
📄 一句话概括

CentOS 7 的问题只有一个字:老。 同一份源码,Ubuntu 能编过,CentOS 7 可能就卡在编译器上。

📝 本节和前面几节的关系

11.2.1 在 Ubuntu 上编,命令一模一样。 这一节讲的是「同样的命令为什么在这台机器上失败」。

一、CentOS 7 的麻烦是「老」

CentOS 7 自带 GCC 4.8.5,而 SRS 新版本要求的门槛就在 4.8 上下。 刚好卡线,能编过一部分,编不过另一部分。

依赖装起来是这样:

yum install -y gcc gcc-c++ make perl
yum install -y openssl-devel
yum install -y tcl

perl 与 tcl 这两条最不像「编译依赖」: 它们既不参与编译 C 代码,也不是库, 但 SRS 的构建脚本要靠它们生成配置头文件。

二、依赖清单里 tcl 最容易漏

漏了 tclsh 的现象很有特征:编译能正常开始,编了好几分钟, 然后突然报一句 tclsh: command not found。

为什么报得这么晚? 因为 tclsh 是在「配置头文件生成」阶段才被调用的, 而那一步排在前面几轮 C 编译之后。 前面几分钟的活全白做。

所以正确的顺序是:先把依赖全查一遍,再开始编。 这也是第 120 号 Demo 做的事——把六个依赖逐个查、逐个判版本,比编到一半再补省十几分钟。

三、版本不够就换 devtoolset

真要更高版本的编译器,CentOS 的正路是 SCL(软件集合):

yum install -y centos-release-scl
yum install -y devtoolset-8-gcc devtoolset-8-gcc-c++
scl enable devtoolset-8 bash

第三条是关键,也是最容易忘的: 装了 devtoolset 不会自动改默认编译器,必须用 scl enable 进那个环境。 退出这个 shell,gcc -v 又变回 4.8。

所以永久生效要写进启动脚本,或者用 scl enable ... -- make 包一层。 不写这一层,就会出现「我明明装了 8,怎么还在用 4.8」。

四、动手 Demo:编译前先查依赖——六个命令,一张表

把编译要的东西逐个查一遍,顺手把版本判了。 这一步在真机上只要十秒,能省掉十几分钟的来回。

need = [
    ("gcc", ["gcc", "-dumpversion"], 4.8),
    ("g++", ["g++", "-dumpversion"], 4.8),
    ("make", ["make", "-v"], None),
    ("tclsh", ["tclsh"], None),
    ("git", ["git", "--version"], None),
    ("openssl", ["openssl", "version"], None),
]

for name, cmd, minv in need:
    if shutil.which(cmd[0]) is None:
        print(name, "没有")
        continue
    r = subprocess.run(cmd, capture_output=True, timeout=10)
    txt = (r.stdout or r.stderr).decode("utf-8", "replace").strip()
    verdict = "-"
    if minv is not None:
        digits = "".join(c for c in txt if c.isdigit() or c == ".")
        verdict = "够" if float(digits) >= minv else "不够"
    print(name, txt, verdict)

实跑输出:

--------------------------------------------------------------------
CentOS 上装 SRS——依赖版本先查清楚
--------------------------------------------------------------------
**① CentOS 7 的麻烦是「老」**

  **CentOS 7 自带 GCC 4.8,而 SRS 更新的版本要求 GCC 4.8 以上,**
  **有的特性还要更高。**
  **所以第一件事不是装 SRS,是确认编译器够不够。**

  **装依赖大概是这样:**

    yum install -y gcc gcc-c++ make perl
    yum install -y openssl-devel
    yum install -y tcl

  **`tcl` 那条很多人会漏:**
  **SRS 的编译脚本用 `tclsh` 生成配置头文件,**
  **缺了会在编译中途报 `tclsh: command not found`。**
  **这个报错出现得很晚,前面已经编了几分钟。**

**② 真查一遍本机的情况**

  **把编译需要的东西逐个查,把「版本够不够」也一起判了。**

  依赖        有没有     版本                     够不够
  ----------------------------------------------------------
  gcc         没有       -                        不够
  g++         没有       -                        不够
  make        没有       -                        不够
  tclsh       没有       -                        不够
  git         有         git version 2.55.0..     -
  openssl     有         OpenSSL 3.5.7 9 Ju..     -

  **这张表的意义在于「提前发现」:**
  **缺 tclsh 在编译第五分钟才报,**
  **缺 openssl-devel 在编 RTC 那部分才报。**
  **先查一遍,省掉十几分钟的来回。**

  **GCC 版本那一栏要特别注意:**
  **CentOS 7 默认 4.8,正好卡在门槛上。**
  **要更老的版本就编不过,要用更新的特性就得换 `devtoolset`。**
  **这也是「同一份代码在 Ubuntu 上能编、在 CentOS 上编不过」的常见原因。**

沙箱里只找到了 git 与 openssl,编译器一个都没有。 这正好说明「先查」的价值:缺什么一眼就知道,不用瞎猜。 判版本那段只取第一段数字,遇到 OpenSSL 3.5.7 也能读成 3.5。 真机上 gcc -dumpversion 只给 4.8.5 这种裸数字,更简单。

30 秒实验

  1. 在 CentOS 7 上跑 gcc -dumpversion,猜出来几位数——4.8.5,正好卡在门槛上。
  2. 只装 gcc 不装 gcc-c++,看编到哪一步失败——很早就失败,SRS 主体是 C++。
  3. 用 devtoolset-8 重新编,猜要不要额外操作——要,得先 scl enable devtoolset-8 bash 才生效。

常见误区

  1. 「CentOS 7 自带的 gcc 够用」——4.8 只是刚好卡线,新版本要更高。
  2. 「tcl 是可选的」——缺了会在编译中途报错,前面几分钟全白费。
  3. 「装了 devtoolset 就自动生效」——要 scl enable 进那个环境。
自测三问(点开对答案) 1. CentOS 7 自带 gcc 是哪个版本? —— **4.8.5**,正好卡在 SRS 的门槛上。 2. 漏装 tcl 会有什么表现? —— **编译到中途才报 `tclsh: command not found`**,前面的活白做。 3. 为什么同一份代码 Ubuntu 能编、CentOS 编不过? —— **编译器版本不同**,4.8 缺一些新特性。

相关笔记