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 秒实验
- 在 CentOS 7 上跑
gcc -dumpversion,猜出来几位数——4.8.5,正好卡在门槛上。 - 只装 gcc 不装 gcc-c++,看编到哪一步失败——很早就失败,SRS 主体是 C++。
- 用 devtoolset-8 重新编,猜要不要额外操作——要,得先
scl enable devtoolset-8 bash才生效。
常见误区
- 「CentOS 7 自带的 gcc 够用」——4.8 只是刚好卡线,新版本要更高。
- 「tcl 是可选的」——缺了会在编译中途报错,前面几分钟全白费。
- 「装了 devtoolset 就自动生效」——要
scl enable进那个环境。
自测三问(点开对答案)
1. CentOS 7 自带 gcc 是哪个版本? —— **4.8.5**,正好卡在 SRS 的门槛上。 2. 漏装 tcl 会有什么表现? —— **编译到中途才报 `tclsh: command not found`**,前面的活白做。 3. 为什么同一份代码 Ubuntu 能编、CentOS 编不过? —— **编译器版本不同**,4.8 缺一些新特性。- ☐ (本节完,下一节 11.3.1 SRS 集群简介)