1、webrtc编译依赖的环境变量(以下设置的路径换为自己安装的路径即可)
cmd设置以下变量(不想每次都是手动输入,可以在添加到环境变量中)
set DEPOT_TOOLS_WIN_TOOLCHAIN=0
set GYP_MSVS_VERSON=2019
set vs2019_install=F:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise
set GYP_MSVS_OVERRIDE_PATH=F:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise
set WINDOWSSDKDIR=F:\Windows Kits\10
set GYP_GENERATORS=msvs-ninja,ninja
2、webrtc工程构建以及部分构建参数说明
gn构建编译工程指令举例
打开cmd,首先进入webrtc源码的src目录下,执行如下指令
gn gen out\release\x86 --ide=vs2019 --args="is_debug=false target_os=\"win\" target_cpu=\"x86\" is_component_build=false is_clang=false use_lld=false rtc_include_tests=false rtc_use_h264=true proprietary_codecs=true ffmpeg_branding=\"Chrome\" use_rtti=true use_custom_libcxx=false treat_warnings_as_errors=false use_ozone=true rtc_use_x11=false use_glib=false rtc_enable_libevent=false rtc_build_libevent=false rtc_build_tools=false rtc_use_pipewire=false rtc_build_ssl=false rtc_build_examples=false ffmpeg_use_unsafe_atomics=true rtc_ssl_root=\"E:\jhcao\open_source\webrtc\src\third_party\""
编译程序:ninja -C out\release\x86
gn工程构建部分编译选项参数说明(有兴趣可以查看源码中的gn文件了解细节)
参数项 | 说明 |
---|---|
is_debug | true-debug版本,false-release版本 |
target_os | 操作系统类型,win\linux\android\ios等 |
target_cpu | windows平台编译 32位x86, 64位x64 |
is_component_build | true是将最后一步本来很长的链接操作,改为链接成很多个分离的共享库的操作。它是默认的debug版的编译方式(除iOS编译), 并且大多数开发者使用这种模式用于每天的编译及调试。这种模式启动会很慢, 而且一些链接优化会被禁用,所以这不是测试的标准。有些人喜欢在release编译启用这种模式,来获取更快的链接速度和合理的运行性能。 |
is_clang | falses不使用clang编译器 |
rtc_use_h264 | 是否使用H264,这里取true,注意Windows平台编码使用OpenH264,解码使用ffmpeg |
rtc_build_ssl | false指定使用的openssl |
rtc_ssl_root | 指定使用的openssl头文件的根路径(异常处理中有举例) |
use_custom_libcxx | WebRtc编译默认使用libc++来编译,而我们编译别的代码用的是libstdc++,这样在编译的过程中就会导致用到std::string的地方各种错误 |
3、webrtc编译过程中异常解决方案
1、【Exception: dbghelp.dll not found in “F:\Windows Kits\10\Debuggers\x64\dbghelp.dll”】
进入 控制面板→程序→程序和功能—>Windows Software Development Kit - Windows 10.0.19041
右击选择更改-->change,勾选Debugging Tools for Window 最后change确认即可
2、【使用自己编译的指定的openssl】
通过rtc_build_ssl=false参数可以控制编译时不使用boringssl,但是不能控制third_party中的文件使用boringssl,因为third_party中的BUILD.gn中没有rtc_build_ssl这个参数,需要手动修改webrtc-checkout\src\third_party\libsrtp\BUILD.gn中的文件。(目前发现只有这一个文件使用,其它暂时未用到boringssl)。
以下是将openssl头文件放在 src\third_party目录下的配置示例
gn gen 的编译选项中增加 rtc_build_ssl=false rtc_ssl_root=\"XXX\src\third_party\"(xxx是代码存放的绝对路径)
3、【默认编译webrtc生成的静态库,在vs2019中使用的时候,运行库为多线程调试MT/MTD,但是在需要包含其它库的时候,其它多数库运行库为多线程调试MD/MDD,vs中显示运行库的多进程调试方式如下,解决方案需要修改src\build\config\win\BUILD.gn文件,修改方案如下图】
4、webrtc\src\third_party\ffmpeg\libavcodec\utils.c(46): fatal error C1083: 无法打开包括文件: “stdatomic.h”: No such file or directory 】
gn gen 的编译选项中增加ffmpeg_use_unsafe_atomics=true
原因是对应的third_party\ffmpeg的BUILD.gn 中ffmpeg_use_unsafe_atomics是头文件包含的开关选项
5、【…/…/…/third_party/ffmpeg/libavcodec/pcm.c(52): error C2065: “CONFIG_PCM_VIDC_ENCODER”: 未声明的标识符
…/…/…/third_party/ffmpeg/libavcodec/pcm.c(633): error C2059: 语法错误:“字符串” …/…/…/third_party/ffmpeg/libavcodec/pcm.c(634): error C2059: 语法错误:“字符串” 】
注释报错所在行的内容即可(目前未发现使用上存在问题,后续遇到问题会调整)
6、【…/…/…/third_party/ffmpeg/libavcodec/vp3.c(2433): error C2065: “CONFIG_VP4_DECODER”: 未声明的标识符】
ffmpeg编译工具链生成的config.h中,window平台的没有CONFIG_VP4_DECODER,此处可以在vp3.c文件头自己申明一个 #define CONFIG_VP4_DECODER 0即可
7、【 fatal error C1002: 在第 2 遍中编译器的堆空间不足 】
继续执行ninja -C 编译指令,编译过程中可以查看下电脑的内存使用率,我的可用内存7.4G,编译的时候基本在7G左右浮动,所以容易出现编译提示内存不足而报错
8、【fatal error C1189: #error: "See: bugs.webrtc.org/9213#c13.】
注释报错文件中的报错相关的行(m94分支共计3个文件中存在)
//#if defined(WEBRTC_WIN) && !defined(__clang__)
//#error "See: bugs.webrtc.org/9213#c13."
//#endif
存在)
//#if defined(WEBRTC_WIN) && !defined(clang)
//#error “See: bugs.webrtc.org/9213#c13.”
//#endif