简介:面向Windows 10平台的WebRTC编译成品压缩包,适合需要在本地集成实时音视频能力的开发者。包内为Release版编译输出,省去自行配置工具链、拉取源码和等待编译的时间,可直接获得库文件与头文件进行项目调用和功能验证。资源共9480个文件,压缩后约931.91MB,主要包含lib库、dll动态库、exe可执行程序、h头文件和pdb调试符号,另有大量obj中间文件以及ninja、vcxproj构建配置,可满足链接、运行、调试与二次编译需求。目前已有749人学习/浏览。压缩包内既有可引用的静态与动态库,也包含可执行测试样例及资源文件,便于验证音视频通话、屏幕共享等能力;对想了解Win10平台WebRTC构建产物结构的开发者,也提供了完整目录参考与排错线索。使用时建议结合本机Visual Studio版本与依赖环境,避免工具链差异导致链接错误。
1. 拿到 WebRTC 编译生成目录 Release.7z 后:这份 7z 到底值不值得解压
第一次拿到 WebRTC 编译生成目录 Release.7z,多数人第一反应是解压、塞进工程、连库,然后被三连报错劝退:找不到头文件、LNK2019 未解决的外部符号、测试脚本闪退。这份 Release 目录的价值,不只是替你省掉几小时编译等待,而是给你一套 Win10 平台下可以直接对照的 WebRTC 二进制落点:库文件、头文件、.pak 资源,以及一整套验证功能的测试脚本。
它能解决的实际问题,是你做音视频通话、屏幕共享、点对点传输时,不必自己从 depot_tools 起步拉源码编译,链接就能把核心能力接进自己的 Windows 工程。它不解决的信令方案、TURN 中继这类外围工程问题,也不负责替你的程序适配摄像头和麦克风驱动。
适合两类人:一类是做应用层开发、不想碰 gn 和 ninja 的 C++ 工程师;另一类是编译反复失败、想拿一份正常产物做参照对比的入门者。想弄懂 WebRTC 内部每个模块怎么实现的,应该去读源码,而不是解压 7z。
2. Win10 上编译 WebRTC 的全链路:从 depot_tools 到 ninja,参数错一步全盘重来
虽然这份 7z 已经把你想要的二进制产物打包好了,我依然建议先看懂编译链路。因为等你真正开始链接自己工程、排查运行错误时,几乎所有问题都出在这条链路的某个节点上:环境不对、gn 参数不匹配、产物形态搞混。先看链路再谈使用,后面几章你才知道那些 .lib、.dll 和 .bat 到底是怎么来的,以及为什么有的能直接搬走,有的必须老老实实留在原位。
2.1 环境准备:VS 工具链、Git、Python 和那条决定生死的 PATH
WebRTC 官方在 Win10 上的整套构建,是围绕 Chromium 的 depot_tools 设计的。depot_tools 是 Chromium 系的工具集,它负责源码获取、依赖同步和构建脚本生成,你用 Community 版 Visual Studio 也可以,装上 C++ 桌面开发组件就行,版本从 VS2015 起步都能编,新一点的源码建议 VS2019 或 VS2022,具体由构建脚本去探测验证。这里有个容易踩空的点:别只装 C# 和 .NET 负载,缺了 MSVC 编译器和 Windows SDK,后面一步都走不了。
Git 和 Python 是另外两个前置。Git 负责拉 WebRTC 源码仓库,Python 负责跑 gclient 和一批代码生成脚本。装完以后把 depot_tools 目录追加到 PATH 最前面,注意路径里不要有中文和空格,C:\depot_tools 是最省心的位置。PATH 顺序也有讲究,depot_tools 自带的 Python 和 Ninja 必须优先于系统里其他同名工具,否则 gclient 会在执行到一半时莫名其妙报"模块找不到"。
set PATH=C:\depot_tools;%PATH% where gclient gclient --versionset 只对当前 cmd 窗口有效,想全局生效要在系统环境变量里把 C:\depot_tools 放到 Path 第一位。where 命令用来确认你调用的 gclient 确实是 depot_tools 里的那个,而不是别的路径下冒出来的同名脚本。这两条命令跑通,环境这一步就算站住了。
环境这块最容易翻车的是版本混乱。机器上同时装 VS2015 和 VS2022,depot_tools 会按自己的策略选一个工具集,如果选错,编译到一半会报工具集版本不一致。我的做法是只保留一份 VS 的 C++ 工具链,其余版本不装桌面 C++ 负载,能省掉后面一大半玄学报错。
2.2 gclient sync:拉源码和依赖时最容易翻车的那一步
环境就绪后,在准备放源码的目录执行两条命令。第一条 gclient config 生成 .gclient 工程描述文件,第二条 gclient sync 开始拉取源码和全部依赖。WebRTC 最初是作为 Chromium 的一部分开发的,它的源码树里挂着大量 Chromium 公共库,所以 sync 的体量非常大,磁盘建议留出 60GB 以上,机械硬盘会等得很痛苦,SSD 能让你舒服很多。
gclient config https://webrtc.googlesource.com/src gclient sync --forcegclient config 只写配置,真正干活的是 sync。--force 通常用于第一次拉取或者上次同步失败之后,它会强制重新校验仓库状态,避免"目录已存在但 git 仓库残缺"的诡异情况。如果你需要的是老版本分支,常见做法是在 config 时加 --with_branch_heads;不需要分支就按默认主干编译,参数会更简单。
需要提前说明的是,--force 并不是万能后悔药。sync 中断后重跑,它偶尔会卡在 third_party 的某个子目录,提示目录已存在或不是有效仓库。这种时候要把 src 下对应残缺目录手动删掉再同步,具体处理我放在第 5 章展开。另外 gclient sync 会顺带把依赖工具链一并装好,这个过程耗时不短,看到命令行长时间不动是正常现象,不是卡死。
我的建议是同步前先挂好可靠的网络环境,同步中不要强行中断。万一断了,先记下报错里指向哪个路径,再按第 5 章的方法处理。gclient 的状态文件确实带了断点续传的设计,但残缺目录比断网更麻烦,因为它会骗过下一次 sync 的检查。
2.3 gn gen 与 ninja:Release 版的关键参数和耗时账单
源码到位后,构建系统是 gn 生成 ninja 文件、再由 ninja 执行编译。gn 是 Chromium 系的构建配置工具,它不直接编译,而是为指定的输出目录生成 build.ninja。先创建 out/Release 构建目录并写入参数,这一步决定了后面所有产物的形态,而且改一次参数基本等于重编一遍受影响的 target,所以参数要尽量一次定死。
gn gen out/Release --args="is_debug=false is_component_build=false use_rtti=true target_cpu=\"x64\"" ninja -C out/Releasegn gen 的 --args 是构建系统的变量集合。is_debug=false 表示 Release 模式,这会影响优化等级、符号信息和断言是否开启;is_component_build=false 让库以静态库形态统一输出,方便分发和链接,代价是最终链接你的工程时耗时更长;use_rtti=true 开启 RTTI,为了让库和你默认开着 /GR 的 MSVC 工程兼容;target_cpu=x64 产出 64 位库,这个必须和你自己的应用程序位数一致。ninja 那一行是真正开始编译,-C 指定构建目录。
| 参数 | 取值 | 作用 | 我的建议 |
|---|---|---|---|
| is_debug | true/false | 是否调试版,Release 选 false | 对外交付用 false |
| is_component_build | true/false | true 产 DLL,false 产静态库 | 分发用 false |
| use_rtti | true/false | 开启 RTTI,影响 dynamic_cast | 与调用方工程保持一致 |
| target_cpu | x64/x86 | 目标 CPU 架构 | 对齐主程序位数 |
| symbol_level | 0/1/2 | 符号信息深度,1 可调试 | 想调试设 1 |
| rtc_use_h264 | true/false | 是否编入 H.264 编码 | 按授权场景决定 |
ninja 的耗时账很简单:几个 G 的源码,新一点的机器(8 核 16G 内存)通常一个小时到几个小时不等,磁盘 IO 和散热还会再拉长一截。编完后所有产物都在 out/Release 目录下,里面就能看到你手上这个 7z 里的库、测试程序和 .pak 资源。注意 ninja 是增量编译的,如果中途改了 args,它会重新生成构建文件并把受影响的 target 全量重编,那几小时的账单要重新付,这也是我反复强调参数一次定稿的原因。
3. Release 目录的真实结构:哪些能直接搬走,哪些必须留在原位
解压工具这里先插一句:在 Win10 上解压 .7z,别用系统自带的压缩文件夹,右键"全部解压"经常解出半截或者丢了符号链接。我的习惯是装 7-Zip 处理,解压时把 out/Release 的内容完整还原,解压路径同样不要带中文,放到 C:\webrtc\Release 这种短路径下最省心。解压后先别急着往工程里搬,先把这个目录的结构摸清楚。
3.1 .lib 和 .dll:核心组件怎么分类,链接时按什么给
在 is_component_build=false 的前提下,Release 目录的核心产物是一个整包静态库加一组模块级静态库,命名一般围绕 webrtc 和模块名展开。头文件负责声明 API,库文件负责实现。链接时把库路径指到 Release 目录,然后在 MSVC 的"附加依赖项"里按顺序加入。
如果你拿到的这份 7z 对应的是组件构建,那你会看到一组 .dll 和对应的导入库 .lib。区分方法很简单:目录里有没有 webrtc.dll 这种动态库文件。有,就是组件构建,运行时必须带上整套 dll;没有,就是整包静态链接,链接产物是单个体积较大的 lib。这个判断直接影响你后面怎么配运行环境。
| 条目 | 常见形态 | 在工程里的角色 | 使用注意 |
|---|---|---|---|
| 静态库 | webrtc.lib 或模块级 .lib | 编译链接进你的 EXE/DLL | 保持 /MT 与 /MD 一致 |
| 动态库 | webrtc.dll 形式 | 运行时加载 | 必须随 EXE 一起部署 |
| 头文件 | api/、rtc_base/、modules/ 下 .h | 编译期 API 声明 | include 根目录指到外层 src |
| 资源文件 | .pak、icudtl.dat | 本地化与 ICU 数据 | 运行时按相对路径能找到 |
| 测试程序 | 各 *_unittests.exe | 验证库的行为 | 依赖配置和数据文件 |
| 构建脚本 | 一个 .bat 家族 | 一键触发测试 | 不要双击,用 cmd /k 执行 |
表里最容易搞错的是"include 根目录指到外层 src"。Release 目录只是构建产物,头文件在源码树里按 api、rtc_base、modules 这些目录组织,所以你工程的附加 include 目录应该指到包含这些子目录的 src 根,而不是 Release 目录本身。否则 #include "api/peer_connection_interface.h" 这种官方写法会解析失败,直接报找不到头文件。
3.2 头文件:API 全貌和 include 路径的组织方式
WebRTC 的头文件组织是模块化的。api/ 目录下放面向开发者的顶层接口,比如 peer_connection_interface.h、create_peerconnection_factory.h,这些是你集成通话功能时主要用到的;rtc_base/ 放基础工具,线程、SSL、网络地址这类;modules/ 放音频视频的具体模块,像 audio_processing、video_capture、desktop_capture。看到这三个目录结构,你基本能猜到 Release 目录里那些测试程序为什么按模块命名,它们测的就是这些目录下的实现。
链接自己的程序时,配置 include 目录为 src 根之后,代码里最常见的是这样三行路径依赖:第一行是 peer connection 的工厂创建,第二行是连接对象接口,第三行属于音频解码器扩展。前两行足以支撑起一个最小 PeerConnection 示例;音频解码器那行只在你想自定义解码器工厂时才需要。
#include "api/create_peerconnection_factory.h" #include "api/peer_connection_interface.h" #include "api/audio_codecs/audio_decoder_factory_template.h"这里有个选型细节值得说:如果只是快速验证库能不能通,include 到 api 层就够;如果你要改到编码器内部参数,才需要去翻 modules 下的音频处理头文件。头文件引用关系是分层的,多数第三方开源库会直接包含 modules 里的大头,编译时间会明显变慢,我一般建议只在必要的地方引深层头文件。
3.3 .pak 资源与可执行程序:本地化、ICU 数据和测试程序的角色
.pak 文件和 icudtl.dat 这类资源经常被忽略,但它们是程序运行时报"Cannot open resource file"的元凶。WebRTC 的本地化字符串和 ICU 国际化数据都放在资源文件里,程序启动时按相对路径去定位。你链接了 webrtc.lib 之后,EXE 运行时会在自己的相对目录里找这些资源,不是把它挪到随便哪个子目录就能不管的。测试程序也一样,它们跑起来要读配置和数据文件,所以别只挑 exe 拷走,资源文件必须留在同一套目录结构里。
可执行文件这边的价值有两个:一是验证这份 7z 能不能跑,二是当你在自己工程里遇到"不知道是库的问题还是我代码的问题"时,先跑官方测试程序做定位。下一章我会把这十个 .bat 启动器逐一拆开,让你明白哪支脚本对应哪一块功能。
最后提醒一个边界:Release 目录里如果带了 args.gn 之类的配置记录文件,那是你的后悔药。拿到别人的编译产物,第一步不是急着链接,而是先打开看里面的 gn 参数,确认它到底是 Debug 还是 Release、静态还是组件构建、x64 还是 x86。这几个关键信息对不上,后面所有排错都会加倍痛苦。
4. 十个 .bat 测试脚本拆解:每个入口分别验证 WebRTC 的哪个模块
这十个脚本名字乍看是一堆批处理文件,其实它们是 gn 构建时自动生成的测试入口。脚本内部结构基本一致:找到对应的测试可执行文件,带上参数执行,把输出写到日志或控制台。所以你要做的不是逐个双击,而是先弄清每个脚本背后的测试对象,再决定跑哪一支、怎么跑,以及跑出来的结果到底说明什么。
4.1 单测入口:peerconnection、system_wrappers、audio_decoder、common_audio、common_video、test_support
| 脚本 | 背后可执行文件 | 验证内容 |
|---|---|---|
| run_system_wrappers_unittests.bat | system_wrappers_unittests.exe | 系统封装层:时钟、线程、CPU 特性、原子操作 |
| run_audio_decoder_unittests.bat | audio_decoder_unittests.exe | 内置音频解码器的逻辑正确性 |
| run_common_audio_unittests.bat | common_audio_unittests.exe | 公共音频底层:信号处理、滤波器组 |
| run_common_video_unittests.bat | common_video_unittests.exe | 公共视频底层:帧缓冲、格式转换与色彩空间 |
| run_peerconnection_unittests.bat | peerconnection_unittests.exe | PeerConnection 接口、ICE、DTLS、SDP 协商 |
| run_test_support_unittests.bat | test_support_unittests.exe | 测试支撑库自身逻辑,常带泄漏检查项 |
这六支里最值得信任的是 peerconnection 那一支。它是 WebRTC 对外的主 API,单测覆盖信令协商、连接建立、流收发这些最核心路径,它通过了,代表这份库大体可用。system_wrappers 是底层封装,时钟和线程这类基础组件出错,上层全崩,所以它在验证顺序里排很前。test_support 则是"测试的测试",它过了说明 gtest 宿主环境在这台机器上没问题,后续跑其他单测的结果才可信。
audio_decoder、common_audio、common_video 三支属于模块级单测,正常通过时你会看到 [RUN] 和 [OK] 交替刷屏。它们失败时,断言信息通常会把具体实现文件和行号打出来。这时候先别怀疑库坏了,先看是不是运行环境缺了测试数据文件,或机器上有没有对应媒体设备。
跑单测最常见的参数是 --gtest_filter,只跑指定用例。比如只关心 PeerConnection 的 ICE 部分,可以这样限定范围,能省掉大半分钟启动时间。连跑三遍则用于观察偶发失败,ICE 这类涉及端口和超时的用例最容易出概率性问题。
:: 只跑 PeerConnection 中和 ICE 相关的用例 peerconnection_unittests.exe --gtest_filter=PeerConnectionTest.TestIce* :: 连跑 3 遍,用于观察偶发失败 peerconnection_unittests.exe --gtest_repeat=3gtest_filter 用模式匹配,星号是通配符,case 名写错时 gtest 会提示 0 tests run,这种"静默全跳"就是 filter 写错的信号。gtest_repeat 在网络相关测试里很实用,重复三次能看出是稳定通过还是概率性失败。我一般在确认某个偶发问题时用 repeat,平时不做,因为耗时翻倍。
4.2 性能与场景测试:low_bandwidth_audio、audio_codec_speed、video_capture
run_low_bandwidth_audio_test.bat 面向的是低带宽音频场景,验证码率被压得很低时,编码器还能不能保持可用质量。它通常对应 Opus 这类自适应码率编码器在 32kbps 甚至更低区间的表现。这支测试比较吃 CPU,跑的时候机器上别开满负载任务,否则结果会被系统调度拖累,出现不正常的耗时。
run_audio_codec_speed_tests.bat 是编解码速度测试,不看质量看耗时,衡量编码器在一秒内能处理多少音频数据。它的输出是耗时统计,这里最容易误读的是"编码越慢代表实现越差"。不对,有的配置是用高复杂度换音质,你得看同一配置下的相对变化,而不是跨配置比绝对值。
run_video_capture_tests.bat 是视频采集测试,会枚举摄像头并尝试抓帧。机器没有摄像头时,这支脚本大概率会直接失败到设备不存在,这不是库坏了,是环境缺硬件。跑之前先确认摄像头被系统正常识别,再确认没有其他程序占用。Windows 上摄像头一旦被占用,WebRTC 拿不到流,测试会一直挂在初始化阶段。
run_webrtc_nonparallel_tests.bat 在这批脚本里比较特别,它不是一个模块名,而是"非并行测试"合集。WebRTC 部分用例涉及端口绑定、全局状态和共享资源,本来就不能和别的用例并发跑,构建系统把它们单独归到这里。这支脚本适合作为串行回归,在你改过网络参数或换了运行环境之后手动执行一次,可以揪出并行模式下被掩盖的时序问题。
4.3 看脚本内部:这些 .bat 都是同一个跳板
这些 .bat 文件不是手写的,是构建系统自动生成的,内部逻辑通常只有两三行:切换目录、找对应 exe、执行并保存输出。在 Windows 上直接双击,窗口在日志写完后就关了,失败信息全被吞掉。正确姿势是先用 type 看它到底执行什么,再用 cmd /k 让它保留窗口。
:: 查看脚本内容,确认它调用的可执行文件与参数 type run_peerconnection_unittests.bat :: 用 cmd /k 打开并运行,窗口保留便于翻看输出 cmd /k run_peerconnection_unittests.battype 看一眼就知道脚本实际执行的命令;cmd /k 的作用是执行完不退出,这样 gtest 的输出和失败摘要能完整留在眼前。这两条命令能解决 80% 的"脚本闪退"困惑。很多人怀疑是包坏了,其实只是窗口关太快,什么都没看见。
如果你拿到的 7z 里只有脚本、没有对应 exe,那说明压缩时只挑了部分产物打包。这不是脚本问题,是包不完整。判断方法就是对照脚本里写明的可执行文件路径,检查 Release 目录里缺哪个补哪个。后面如果要接 Janus 这类网关做多人房间,你还会遇到信令和媒体配置问题,那是另一层战场,但前提永远是这份基础产物先能跑通。
5. 常见问题与避坑:在 Win10 上折腾 WebRTC 的五个翻车现场
这一章是我自己踩过、也带别人踩过的真实现场。每条都按"现象、原因、解决"的方式写,你在复现时直接照方抓药即可。
5.1 gclient sync 中断后重跑,一直报目录已存在
现象:sync 拉一半网络断掉,或者磁盘满了,重跑 gclient sync 时提示某个目录已存在且不是有效的 git 仓库,常见于 src/third_party 下某个子模块。
原因:gclient 的同步不是事务式的。它把依赖拆成一个个独立 git 仓库逐步拉取,哪个步骤坏了就会留下残缺目录。下次 sync 检查发现目录存在,会认为这个依赖已就位,于是跳过它又报冲突,属于状态文件和实际磁盘内容不一致。
解决:先看报错里指到哪个路径,把它整个删掉再重新 sync。如果坏的目录多,直接把 src/third_party 下所有半截子目录清理一遍。另外,上一次失败后要把报错里第一行路径记下来,别急着反复重跑。重跑十次不改目录,只会报十次同样的错。我的习惯是失败后先清理残缺目录,再回到网络问题上排查。
5.2 Release 库链接时缺符号,头文件版本和库版本对不上
现象:链接 webrtc.lib 时刷出成片 LNK2019 或 LNK2001,符号名带着 _imp前缀,或者某个 WebRTC 类的方法死活找不到。
原因:最常见的是头文件被别处覆盖。工程里同时引用了别的第三方库,里面可能带了一份旧版 WebRTC 头文件,include 搜索顺序让旧头文件先命中,声明和符号对不上,链接自然失败。其次是组件构建和静态构建混用:拿的是整包 lib,却用了按组件模式生成的头文件宏定义,导入导出标志不一致,直接缺符号。
解决:把工程的附加 include 目录调整到对应 src 根,且排在其它含 WebRTC 头文件的路径前面。同时确认 is_component_build 的产物形态,动态库形态要链接导入库,运行时还得带上一整套 dll。如果你还想在 Release 下调试却断点进不去,多半是编译时 symbol_level 设成了 0,这个只能回到构建参数里把 symbol_level 开到 1 重编,符号文件有了,断点才进得去。
5.3 运行时缺 DLL,或程序直接报 0xc000007b
现象:编译链接全部通过,运行 exe 弹窗提示找不到 vcruntime140.dll 或 msvcp140.dll,或者干脆报 0xc000007b 应用程序无法正常启动。
原因:WebRTC 的库是在特定 MSVC 版本下编的,它依赖对应的 VC++ 运行库。程序跑到一台没装该运行库的机器上,就会缺 DLL。0xc000007b 则是位数不匹配的典型,常见于 x64 程序加载了 x86 的运行库,或者 target_cpu 与你的主程序架构对不上。
解决:目标机器装一遍对应版本的 VC++ Redistributable,2015 到 2022 的合并包全装上最省事。然后把 WebRTC 的 target_cpu 和主程序架构确认一致。区分这两类问题很容易:缺 DLL 弹的是找不到文件,0xc000007b 弹的是无法正常启动,按这个先做分流,别上来就重装全套系统环境。
5.4 .bat 脚本双击闪退,看不到任何测试输出
现象:双击 run_peerconnection_unittests.bat,窗口一闪就没了,以为测试没通过,其实什么都没看到。
原因:脚本执行完正常退出,窗口随之关闭,这是 CMD 的默认行为。另一种情况是脚本调用的 exe 根本不存在,也是秒退。两种都表现为闪退,但处理方向完全不同。
解决:先用 4.3 里的 cmd /k 保留窗口重跑,这次能看到完整输出。再 type 一下脚本内容,确认它调用的 exe 是否真的在 Release 目录里。八成以上的闪退问题到这一步就结束了,剩下两成是包确实不完整,缺 exe 或缺资源,按报错内容补齐即可。
5.5 RTTI 与异常处理:use_rtti 和 /EHsc 的匹配问题
现象:工程里启用 dynamic_cast 或 typeid 相关代码时,编译报使用了损坏的 RTTI 信息,或链接时出现与异常处理有关的符号缺失。
原因:WebRTC 库编译时 use_rtti 可能被设成 false,而你的工程默认 /GR 是开着的,两边对 RTTI 的处理不一致。异常处理口径也一样,库按 /EHs- 编,你的工程用 /EHsc,异常模型对不上,链接期就会暴露。
解决:拿到别人的 Release 产物时,先看它的 args.gn 配置记录。库没开 RTTI,你的工程也关掉;库开了,你的工程就保持开启。最省心的是让两边的异常处理和 RTTI 完全一致。变更之前想清楚,改这些参数意味着要重新编译对应形态的库。这又回到第 2 章的链条上:为什么我一开始就强调 gn 参数要一次定死,因为每一步选择都在为后面的使用环境买单。
6. 验证这份 Release 是否可用:十分钟快速冒烟体检
6.1 冒烟顺序:先跑依赖少、结果明确的三支
拿到不熟悉的编译产物,我不会一把梭全部十个脚本跑完,先挑三支:run_common_audio_unittests.bat、run_audio_decoder_unittests.bat、run_peerconnection_unittests.bat。顺序逻辑是依赖从小到大:common_audio 是底层,几乎不依赖外部设备,失败多半是库本身的问题;audio_decoder 验证解码器集合,数据文件齐全就能跑;最后才跑 peerconnection,它涉及网络端口、线程调度和媒体协商,最容易受机器环境影响。每一级通过再进下一级,某一级挂了就停在那一级排查。
:: 依次执行三支冒烟脚本,& 确保前一个跑完再跑下一个 cmd /k run_common_audio_unittests.bat & run_audio_decoder_unittests.bat & run_peerconnection_unittests.bat这段命令把三支脚本串起来,跑完窗口不关。如果你想留日志,把输出重定向到文件再翻看更省事,但注意路径要写到有写权限的目录。
6.2 怎么读测试输出:区分环境问题和库缺陷
gtest 的输出格式里,[==========] 开头是统计总览,[ RUN ] 表示开始执行,[ OK ] 表示通过,[ FAILED ] 表示挂了。看到 [ FAILED ],先看断言信息里提到的是哪个文件哪一行。如果涉及 media device 相关,大概率是摄像头或麦克风没插、被占用;如果是 socket、port 相关,考虑防火墙拦截和端口冲突;如果是解压资源相关,回到 3.3 检查 .pak 和 icudtl.dat 的位置,而不是怀疑库算错了数。
自己工程接入之后怀疑库有问题,也先跑这三支官方测试,而不是直接抓着自己的代码调试。官方测试程序通过,说明库在标准环境下行为正确,那是你的调用方式或工程配置有问题;官方测试程序也挂,再回头怀疑这个包本身健不健壮。
从那以后,我每次拿到外来的 WebRTC 编译产物,都会在写代码之前把这三支冒烟脚本完整跑一遍。这个习惯帮我挡掉过两次"看起来能编、跑起来必崩"的坏包——一次是缺 ICU 资源文件,另一次是库和头文件版本错配,都是先跑测试才暴露出来的。血的教训就一句话:类链接成功不叫成功,测试绿灯才叫真能用。希望帮到你。
本文还有配套的精品资源,点击获取