在音视频领域,想深入研究的话,必定会接触WebRTC。WebRTC是一个庞大的工程,就像是音视频领域的百科全书,音视频采集,编解码,传输,渲染等一条龙在WebRTC里都有,而且WebRTC还有很多先进的音视频处理算法。由于WebRTC代码过于庞大,所以最好单步调试跟踪代码运行,这样才可以更好地学习WebRTC,否则很难有头绪。工欲善其事必先利其器,作为调试神器,宇宙第一IDE Visual Studio必不可少。所以本篇文章主要讲下如何在Windows上编译WebRTC,同时得到VS工程,然后调试。 很早以前写过VS2017上的编译,不过那篇文章有点跟不上时代,因为WebRTC用到的编译工具以及版本总是变化的,所以另开此文章,同步更新Windows平台最新编译步骤。 本文内容截止2025.08.18,最新代码测试编译通过 系统要求 Win10及以上64位系统。 内存至少8G,当然越大越好。 至少100G磁盘空间(NTFS格式),不能是FAT32,因为会生成大于4G的文件。 Visual Studio安装 要求 Visual Studio 2022 (>=17.0.0)。这里我们选择VS2022的社区版。安装VS2022时选择自定义安装,必须勾选如下几项: Desktop development with C++组件中10.0.26100.3323或以上的Win11 SDK(如果没看到该版本,去左侧Individual components那里勾选) Desktop development with C++组件中MFC以及ATL这两项 Desktop development with C++组件中适用于Windows的C++ Clang工具,这个很重要,新版WebRTC已经不支持MSVC编译器了 安装完VS2022后,必须安装SDK调试工具。打开控制面板->程序与功能,找到刚才安装的最新Windows Software Development Kit,鼠标右键->change。 勾选Debugging Tools For Windows,然后点击change。 depot_tools安装 下载depot_tools然后解压到某个目录,比我的解压到E盘根目录。接着将该depot_tools目录的路径加到系统环境变量Path里,然后把该路径移到最前面(避免已安装的python与git造成影响)。 或者直接通过如下命令行快速安装设置: [crayon-69d7a7ad2a27c939295692/] 获取WebRTC源码 由于WebRTC的源码地址被墙了,所以需要通过科学工具访问才能得到源码。后面都是命令行操作,打开cmd窗口,例如我用的是Clash代理,在cmd窗口设置如下: [crayon-69d7a7ad2a28a113103309/] 设置当前cmd窗口代理上网,如果cmd窗口关闭了重开得重新设置。 接着执行gclient命令,更新depot_tools。一般我们刚下载的都是最新的,可以跳过这一步。 [crayon-69d7a7ad2a28f895555709/] 后续如果不希望执行gclient有关命令时候自动更新浪费时间,可以通过如下命令设置: [crayon-69d7a7ad2a292527201910/] 再接着设置一些环境变量,设置下我们的VS安装路径以及Windows SDK路径,这里我是安装在C盘。由于我用的社区版,所以路径名后缀是Community,其他VS版本可按实际修改。 [crayon-69d7a7ad2a295230738067/] 然后cd到要放源码的地方,执行: [crayon-69d7a7ad2a298316083970/] 这一过程是个漫长的等待,包括源码,第三方库,以及一些测试的音视频文件资源等,同时自动执行一些hook任务。如果因为网络等原因中断了,就再执行gclient sync。如果这一步一直卡着不动,可以执行ctrl+c,然后执行gclient sync。 这里为了避免中途中断,重新执行gclient sync时间太久,可以将gclient sync分两步执行: [crayon-69d7a7ad2a29c335354660/] 编译工程 生成VS工程文件 首先需要生成工程文件。WebRTC默认使用Ninja作为编译系统,Ninja工程文件通过GN生成,由于我们需要使用VS进行代码编辑调试等,所以使用GN生成Ninja工程时需要配置--ide=vs生成VS的工程文件。通过如下命令生成工程文件(Debug编译,工程文件位于out\Default目录下): [crayon-69d7a7ad2a29f542576585/] 我们可以在src\out\Default下得到 VS2022的all.sln解决方案文件。 如果需要Release编译,通过如下命令生成工程文件: [crayon-69d7a7ad2a2a2088268128/] 如果不想使用默认编译参数,可以使用gn args out/Default --list查看当前编译参数,通过类似如下方式设置: [crayon-69d7a7ad2a2a5340778370/] 编译 生成工程文件后,就可以在src目录下执行编译命令: [crayon-69d7a7ad2a2a8124906856/] 用VS2022打开: 可以看到众多工程,到此算是完成了。找到我们感兴趣的,就可以用VS单步调试,跟踪代码运行了。 代码更新 后续如需要更新代码,按照如下步骤: [crayon-69d7a7ad2a2ab610905624/] 然后参考前面步骤重新生成工程文件,编译即可。 引用WebRTC库 WebRTC编译后会在src\out\Default\obj目录下生成整个WebRTC工程的静态库:webrtc.lib,链接下这个就可以了。 PS:最新版只支持Clang编译器。如果VS应用没配置Clang编译器,链接这个webrtc.lib,生成工程文件时需要配置如下参数: gn gen --ide=vs out/Default --args="is_clang=false use_lld=false" 禁用clang与lld 由于最新版只支持Clang编译器,同时WebRTC也带有自己的Clang编译器(third_party\llvm-build目录下),所以可能跟VS前面配置下载的Clang编译器版本不同,导致出现webrtc.lib链接错误,所以需要配置WebRTC使用Visual Studio的Clang编译器。 拷贝Visual Studio的Clang编译器目录Llvm到webrtc-checkout目录下,当然也可以直接覆盖替换WebRTC自带的。Clang编译器目录位置举例:C:\Microsoft Visual Studio\2022\Community\VC\Tools\Llvm gn gen参数增加:clang_base_path = "..\..\..\..\Llvm",告诉WebRTC使用的Clang编译器目录。也可以修改out\Default\args.gn,增加clang_base_path gn gen参数增加:use_custom_libcxx=false,告诉WebRTC构建系统gn不使用WebRTC 源码中自带的C++标准库(libcxx),而是使用系统或工具链提供的标准C++库,不配置为false,使用Clang编译的会报链接错误 最后修改我们的Visual Studio应用属性配置,使用Clang编译。修改位置:General->Platform Toolset->LLVM (clang-cl) 总结 总之WebRTC在Windows上的编译很考验耐心,只要你的科学上网工具够好,编译就会顺畅很多。 如果遇到问题,可以多看下文章,是不是哪里漏了,或者看下评论,不要一上来就问为什么编译不了。 参考 [1] WebRTC Native code Development.https://webrtc.github.io/webrtc-org/native-code/development/. [2] Chromium’s build instructions for Windows.https://chromium.googlesource.com/chromium/src/+/master/docs/windows_build_instructions.md.