ZLMediaKit 只给 CMake,不给现成的 VS 工程文件。 所以第一次编之前,工具链缺一样就卡在第一步。
第十一章的 SRS 用自带的 configure,这一章换成 CMake。 12.2 到 Linux 上编,命令少一样、麻烦也一样。
一、为什么 Windows 上编它麻烦
SRS 用的是自己写的 configure,ZLMediaKit 用的是 CMake。
CMake 本身不编译,它只负责「生成某个编译器能认的工程文件」。
所以在 Windows 上,链条是「CMake → VS 工程 → 编译」。
这条链上任何一环断了,报错都很像: 都是「找不到命令」,看不出是缺哪一样。 再加上 ZLMediaKit 依赖一个子模块 ZLToolKit, 子模块没初始化时也是编译期才报「找不到头文件」。
所以 Windows 上最常见的三种卡点,按出现顺序是: ① 没有 CMake,第一条命令就失败; ② 有 CMake 但不在 VS 的环境里,生成时报找不到编译器; ③ 编到一半报找不到 ZLToolKit 的头文件,是子模块没拉。
二、工具链先查,缺一样都卡住
要准备四样:CMake 3.10 以上、VS 2017 以上、OpenSSL、libsrtp。 前三样必装,第四样只在开了 WebRTC 时才要。
这里有个区分很重要: 「编不过」是工具链问题,「编过了但用不了」是可选依赖没装。 前者在编译期就崩,后者要等启动甚至等观众连上来才暴露。 所以查依赖要分两轮:先是编译工具,再是运行时功能依赖。
cl 这个命令要特别说明:
它是 MSVC 的编译器,本身装了 VS 就有,但它不在系统 PATH 里。
它只在「开发者命令提示符」那个窗口里才可用。
在普通 cmd 里敲 cl,报的是「找不到命令」,不是「版本不对」。
三、真解析 CMakeLists:九个开关、五个产物
ZLMediaKit 的可选功能全是 option(),产物全是 add_executable()。
把这两类行抠出来,就知道能配什么、能编出什么。
九个开关的默认值分布很说明问题: HLS、MP4、RTPPROXY、FFMPEG、测试、播放器默认开, WebRTC、SRT、C API 默认关。 和 SRS 一样,扩展功能要显式开。
五个可执行文件里,日常只跑 MediaServer。
另外四个是示例与工具:test_httpApi 演示调接口,
test_pusher 演示推流,test_server 是最小服务器,
test_benchmark 是压测。
第一次编完先只看 MediaServer.exe 在不在,别被一堆 exe 搞晕。
四、动手 Demo:Windows 编 ZLMediaKit——工具链先查
先把要的命令逐个查一遍,再从 CMakeLists 里抠出开关与产物。 这两件事做完,再动手编就不会卡在半路。
need = [("cmake", ["--version"]), ("git", ["--version"]),
("openssl", ["version"]), ("cl", []), ("nasm", ["-v"])]
for cmd, args in need:
if shutil.which(cmd) is None:
print(cmd, "没有")
else:
print(cmd, "有", version_of(cmd, args))
# 从 CMakeLists 里抠 option() 与 add_executable()
def cmake_scan(text):
opts, exes = [], []
for line in text.splitlines():
s = line.strip()
m = re.match(r"option\(\s*(\w+)\s+\"[^\"]*\"\s+(ON|OFF)", s)
if m:
opts.append((m.group(1), m.group(2)))
continue
m = re.match(r"add_executable\(\s*(\w+)", s)
if m:
exes.append(m.group(1))
return opts, exes
opts, exes = cmake_scan(CMAKE)
print(len(opts), "个开关,", len(exes), "个可执行文件")
实跑输出:
--------------------------------------------------------------------
Windows 编 ZLMediaKit——工具链先查
--------------------------------------------------------------------
**① Windows 上编它,缺一样就卡住**
**ZLMediaKit 用 CMake 构建,不提供现成的 vs 工程文件。**
**所以第一次编之前在 Windows 上要准备四样:**
要什么 作用 缺了会怎样
----------------------------------------------------------------------
CMake 3.10+ 生成工程文件 第一步就报找不到命令
VS 2017+ C++ 编译器与运行库 生成失败,报找不到编译器
OpenSSL HTTPS 与 DTLS 能编过,但 TLS 相关功能没有
libsrtp WebRTC 的加密媒体 开了 WebRTC 才需要
**四样里前三样是必装,第四样只在 `ENABLE_WEBRTC=ON` 时要。**
**这也是「编不过」和「编过了但用不了」的分界:**
**前者是工具链问题,后者是可选依赖没装。**
**② 真查一遍这台机器的工具链**
**把编 ZLMediaKit 要的命令逐个查,缺的标出来。**
命令 有没有 版本
-----------------------------------------------------------
cmake 没有 -
git 有 git version 2.55.0.windows.3
openssl 有 OpenSSL 3.5.7 9 Jun 2026 (Libr..
cl 没有 -
nasm 没有 -
**五个命令里缺了 3 个。**
**这台机器上能跑的只有 git 与 openssl,两个编译器一个都没有。**
**所以「在这台机器上编 ZLMediaKit」这件事,第一步就过不去。**
**`cl` 是 MSVC 的编译器,它不在 PATH 里很正常:**
**它只在「开发者命令提示符」那个窗口里才有。**
**在普通 cmd 里敲 `cl`,报的是找不到命令,不是版本不对。**
**③ 真解析 CMakeLists:开关与产物**
**ZLMediaKit 的可选功能全是 `option()`,产物全是 `add_executable()`。**
**把这两类行抠出来,就知道能配什么、能编出什么。**
开关 默认 说明
-------------------------------------------------------
ENABLE_HLS ON 默认开,不想要得显式关
ENABLE_MP4 ON 默认开,不想要得显式关
ENABLE_RTPPROXY ON 默认开,不想要得显式关
ENABLE_WEBRTC OFF 默认关,要用得显式开
ENABLE_SRT OFF 默认关,要用得显式开
ENABLE_CAPI OFF 默认关,要用得显式开
ENABLE_TESTS ON 默认开,不想要得显式关
ENABLE_PLAYER ON 默认开,不想要得显式关
ENABLE_FFMPEG ON 默认开,不想要得显式关
**9 个开关里 6 个默认开、3 个默认关。**
可执行文件 干什么
---------------------------------------------------
MediaServer 服务器本体,这才是要跑的那个
test_httpApi 用 HTTP 接口查状态的例子
test_pusher 读 mp4 往里推流的例子
test_server 最小服务器例子
test_benchmark 压测工具
**一共 5 个可执行文件,但日常只用第一个。**
**其余四个是示例与工具,编出来是给你看代码怎么用的。**
**第一次编先只看 `MediaServer.exe` 有没有生成,别被一堆 exe 搞晕。**
五个命令里缺了三个:cmake、cl、nasm 都没有。
能跑的只有 git 与 openssl,所以这台机器上编不了。
九个开关里六个默认开、三个默认关,和 SRS 的取向一致。
五个可执行文件里只有 MediaServer 是要跑的,其余全是示例。
30 秒实验
- 在「开发者命令提示符」里敲
cl,猜会怎样——能出版本号,因为那个窗口才注入了 VS 的环境变量。 - 把
ENABLE_WEBRTC改成 ON 但没装 libsrtp,猜哪一步报错——编译期报找不到头文件,不是 cmake 阶段。 - 跳过
git submodule update,猜报什么——找不到ZLToolKit/Util/logger.h,编到一半才停。
常见误区
- 「装了 VS 就能直接用 cl」——要开开发者命令提示符。
- 「CMake 会自己编译」——它只生成工程文件,编译是 VS 干的。
- 「开关全开最好」——多一个开关就多一份依赖与构建时间。
自测三问(点开对答案)
1. ZLMediaKit 用什么构建系统? —— **CMake**,不提供现成的 VS 工程文件。 2. `cl` 为什么在普通 cmd 里找不到? —— **它只在开发者命令提示符里注入 PATH**,普通 cmd 没有那套环境变量。 3. 五个可执行文件里日常跑哪个? —— **`MediaServer`**,其余是示例与工具。- ☐ (本节完,下一节 12.2 Linux 编译安装 ZLMediaKit)