编译 WebRTC 的 Window 环境工程

系统要求

  • Win10及以上64位系统。
  • 内存至少8G,当然越大越好。
  • 至少100G磁盘空间(NTFS格式),不能是FAT32,因为会生成大于4G的文件。
  • cmd 窗口

Visual Studio安装

要求 Visual Studio 2022 (>=17.0.0)。这里我们选择VS2022。安装VS2012时选择自定义安装,必须勾选如下几项:

  • Desktop development with C++组件中10.0.22621.0或以上的Win11 SDK(如果没看到该版本,去左侧Individual components那里勾选)
  • Desktop development with C++组件中MFC以及ATL这两项

安装完VS2022后,必须安装SDK调试工具。打开控制面板->程序与功能,找到刚才安装的最新Windows Software Development Kit,鼠标右键->change。

勾选Debugging Tools For Windows,然后点击change。

depot_tools 安装

depot_tools下载

下载后解压到一个文件夹

将该depot_tools目录的路径加到系统环境变量Path里,然后把该路径移到最前面(避免已安装的python与git造成影响)

下载webrtc 源码

在depot_tools 同级目录的cmd窗口,设置科学上网的代理:

arduino 复制代码
set http_proxy=http://127.0.0.1:7881
set https_proxy=http://127.0.0.1:7881

当然这个代理的地址,你根据你自己的实际情况设置

可以通过下面的cmd命令查看设置:

bash 复制代码
echo %http_proxy% 
echo %https_proxy%

接着执行 gclient 命令,安装编译需要用到的一些工具,比如git以及python。

接着,再设置一些环境变量,设置下我们的VS安装路径以及Windows SDK路径,这里我是安装在C盘。

这里比较重要,执行后面的命令依赖这些环境变量,当关闭串口后,再次执行时候,要重行执行一下这些环境变量命令

ini 复制代码
set vs2022_install=C:\Program Files\Microsoft Visual Studio\2022\Professional
set GYP_GENERATORS=msvs-ninja,ninja
set WindowsSdkVersion=10.0.26100.0 # 替换为您实际安装的版本
set WINDOWSSDKDIR=C:\Program Files (x86)\Windows Kits\10
# 告诉depot_tools使用我们本机的VS进行编译
set DEPOT_TOOLS_WIN_TOOLCHAIN=0

如下是我的目录的截图

然后创建源码目录,cd到要放源码的地方,执行:

bash 复制代码
mkdir webrtc-checkout
cd webrtc-checkout
# 生成.gclient文件
fetch --nohooks webrtc
# 主要是根据DEPS文件下载第三方库
gclient sync

这一过程是个漫长的等待,包括源码,第三方库,以及一些测试的音视频文件资源等,如果因为网络等原因中断了,就再执行gclient sync。如果这一步一直卡着不动,可以执行ctrl+c,然后执行gclient sync

过程可能错误 1

多次 gclient sync 即可

过程可能错误 1

csharp 复制代码
D:\program\webrtc\webrtc-checkout>gclient sync
Updating depot_tools...
WARNING:root:depot_tools recommends setting the following for
optimal Chromium development:

$ git config --global core.autocrlf false
$ git config --global core.filemode false
$ git config --global core.fscache true
$ git config --global core.preloadindex true

You can silence this message by setting these recommended values.

You can allow depot_tools to automatically update your global
Git config to recommended settings by running:
$ git config --global depot-tools.allowGlobalGitConfig true

To suppress this warning and silence future recommendations, run:
$ git config --global depot-tools.allowGlobalGitConfig false
10>WARNING: subprocess '"git" "-c" "core.deltaBaseCacheLimit=2g" "clone" "--no-checkout" "--progress" "https://boringssl.googlesource.com/boringssl.git" "D:\program\webrtc\webrtc-checkout\src\third_party\boringssl\_gclient_src_kvh3kn81"' in D:\program\webrtc\webrtc-checkout failed; will retry after a short nap...
10>WARNING: subprocess '"git" "-c" "core.deltaBaseCacheLimit=2g" "clone" "--no-checkout" "--progress" "https://boringssl.googlesource.com/boringssl.git" "D:\program\webrtc\webrtc-checkout\src\third_party\boringssl\_gclient_src_kvh3kn81"' in D:\program\webrtc\webrtc-checkout failed; will retry after a short nap...
Syncing projects:  53% (29/54) src/third_party/icu
src/third_party/boringssl/src (ERROR)
----------------------------------------
[0:00:10] Started.
[0:00:10]

________ running 'git -c core.deltaBaseCacheLimit=2g clone --no-checkout --progress https://boringssl.googlesource.com/boringssl.git D:\program\webrtc\webrtc-checkout\src\third_party\boringssl\_gclient_src_kvh3kn81' in 'D:\program\webrtc\webrtc-checkout'

[0:00:11] Cloning into 'D:\program\webrtc\webrtc-checkout\src\third_party\boringssl\_gclient_src_kvh3kn81'...
[0:00:13] remote: Repository not found.
[0:00:13] fatal: repository 'https://github.com/google/boringssl.git.git/' not found
[0:00:21]

删除调D:\program\webrtc\webrtc-checkout\src\third_party\boringssl目录,然后执行

bash 复制代码
git clone https://boringssl.googlesource.com/boringssl D:\program\webrtc\webrtc-checkout\src\third_party\boringssl

手动下载

然后再执行 gclient sync完成效果如下:

还有一种方式,需改webrtc配置的地址:boringssl.googlesource.com/boringssl.g... 去掉后面 .git

然后再执行 gclient sync --reset --force 强制同步一次

编译工程

一. 生成VS工程文件

首先需要生成工程文件。WebRTC默认使用Ninja作为编译系统,Ninja工程文件通过GN生成,由于我们需要使用VS进行代码编辑调试等,所以使用GN生成Ninja工程时需要配置--ide=vs生成VS的工程文件。通过如下命令生成工程文件(Debug编译,工程文件位于out\Default目录下):

scss 复制代码
cd src
# gn gen --ide=vs2022 out/Debug --args="is_debug=true target_os=\"win\" target_cpu=\"x64\""
gn gen --ide=vs2022 out/Default

gn gen --ide=vs2022 out/Debug --args="is_debug=true target_os="win" target_cpu="x64"" 这个复杂一些,可以来指定参数,按需构造,注意引号

这里我遇到了错误

arduino 复制代码
D:\program\webrtc\webrtc-checkout\src>gn gen --ide=vs2022 out/Default
Traceback (most recent call last):
  File "D:\program\webrtc\webrtc-checkout\src\build\toolchain\win\setup_toolchain.py", line 324, in <module>
    main()
  File "D:\program\webrtc\webrtc-checkout\src\build\toolchain\win\setup_toolchain.py", line 270, in main
    env = _LoadToolchainEnv(cpu, toolchain_root, win_sdk_path, target_store)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\program\webrtc\webrtc-checkout\src\build\toolchain\win\setup_toolchain.py", line 189, in _LoadToolchainEnv
    return _ExtractImportantEnvironment(variables)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\program\webrtc\webrtc-checkout\src\build\toolchain\win\setup_toolchain.py", line 67, in _ExtractImportantEnvironment
    raise Exception(
Exception: Path "C:\Program Files (x86)\Windows Kits\10\\include\10.0.26100.0\\um" from environment variable "include" does not exist. Make sure the necessary SDK is installed.
ERROR at //build/toolchain/win/win_toolchain_data.gni:9:7: Script returned non-zero exit code.
      exec_script("//build/toolchain/win/setup_toolchain.py",
      ^----------
Current dir: D:/program/webrtc/webrtc-checkout/src/out/Default/

找不这个版本,那就安装一下:

你也可以修改编译使用的版本,改为你 C:\Program Files (x86)\Windows Kits\10\Include 目录里面你有的版本

生成成功后,如下:

可以在src\out\Default下得到 VS2022的all.sln解决方案文件,如下:

如果需要Release编译,通过如下命令生成工程文件:

ini 复制代码
gn gen --ide=vs2022 out/Default --args="is_debug=false"

如果不想使用默认编译参数,可以使用gn args out/Default --list查看当前编译参数。然后 通过类似如下方式设置:

ini 复制代码
gn gen --ide=vs2022 out/Default --args="use_rtti=true is_clang=false rtc_build_tools=false rtc_include_tests=false rtc_build_examples=false"

二. 编译

生成工程文件后,有两种方式构建工程

1. 使用命令方式

就可以在src目录下执行编译命令:

ninja -C out/Default

2. 使用visual studio 打开

用VS2022打开:

重新生成解决方案后,有很多错误,都是这种:

在cmd验证一下:

说明是ninja 的环境变量不对,在环境变量里面配置一下:

然后再在cmd里面验证一下版本:

sql 复制代码
ninja --version
where ninja

代码更新

后续如需要更新代码,按照如下步骤:

bash 复制代码
git checkout master
git pull origin master
gclient sync

然后参考前面步骤重新生成工程文件,编译即可。

引用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

参考:

Windows平台WebRTC编译

相关推荐
草巾冒小子5 分钟前
npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本。
前端·npm
拾光拾趣录9 分钟前
K个一组翻转链表的前端工程实践与性能优化
前端·算法
支撑前端荣耀28 分钟前
十、Cypress最佳实践——写出高效又好维护的测试
前端
_一两风37 分钟前
深入浅出Babel:现代JavaScript开发的"翻译官"
前端·babel
3Katrina39 分钟前
深入理解React中的受控组件与非受控组件
前端
_一两风40 分钟前
如何从零开始创建一个 React 项目
前端·react.js
拾光拾趣录1 小时前
两两交换链表节点
前端·算法
OEC小胖胖1 小时前
前端性能优化“核武器”:新一代图片格式(AVIF/WebP)与自动化优化流程实战
前端·javascript·性能优化·自动化·web
~央千澈~1 小时前
laravel RedisException: Connection refused优雅草PMS项目管理系统报错解决-以及Redis 详细指南-优雅草卓伊凡
前端·redis·html·php
pe7er1 小时前
websocket、sse前端本地mock联调利器
前端·javascript·后端