前言
最近对 WebRTC 源码进行了下载和编译,简单记录下载&编译的过程,本文以 M107 版本为例。
安装 depot_tools
depot_tools 是一套 Google 用来编译 Chromium 或者 WebRTC 的构建工具,里面包含gclient、gcl、gn和ninja等工具,其主要的功能是对git的增强,让代码管理和编译更加简单。
Linux/mac
$ git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
设置环境变量
打开~/.bashrc 把depot_tools路径设置到PATH并 source ~/.bashrc
vim ~/.bashrc
export DEPOT_TOOLS_PATH=/Users/hele/Documents/software/depot_tools
export PATH=${PATH}:${DEPOT_TOOLS_PATH}
source ~/.bashrc
windows
https://storage.googleapis.com/chrome-infra/depot_tools.zip下载并解压缩到某处,设置环境变量。csdn下载地址:depot_tools.zip
编译Android
编译 Android 需要使用 Linux 环境,这里用的是Ubuntu20.04系统。
# 创建并切换到 ~/webrtc
$ mkdir ~/webrtc
$ cd ~/webrtc
# 拉取并同步 WebRTC 的最新代码
$ fetch --nohooks webrtc_android
$ gclient sync
默认下载的 master 分支,但我们一般不直接使用 master,而是应该切换到一个 release 版本。webrtc版本号和分支关系可以查看:https://chromiumdash.appspot.com/branches
$ cd ~/webrtc/src
$ git checkout -b m107 branch-heads/5304
$ gclient sync
编译源码
cd src
#安装依赖
./build/install-build-deps.sh
./build/install-build-deps-android.sh
#配置环境变量
. build/android/envsetup.sh
编译
gn gen out/android "--args=is_debug=false target_os=\"android\" target_cpu=\"arm64\""
ninja -C out/android
编译生成so libjingle_peerconnection_so.so ,jar包lib.java/sdk/android/libwebrtc.jar
编译aar
./tools_webrtc/android/build_aar.py --build-dir out/android --arch "armeabi-v7a" "arm64-v8a"
在src下生成libwebrtc.aar
编译mac/ios
在mac上编译,下载源码时设置成ios环境,其他与Android类似
fetch --nohooks webrtc_ios
编译
ios
tools_webrtc/ios/build_ios_libs.py
./tools_webrtc/ios/build_ios_libs.py --output-dir out/ios --arch arm64 --extra-gn-args rtc_include_tests=false rtc_build_tools=false rtc_build_examples=false treat_warnings_as_errors=false
mac
gn gen out/mac --args='target_os="mac" target_cpu="x64" is_debug=false use_rtti=true is_component_build=false rtc_use_h264=false rtc_include_tests=false' --ide=xcode
ninja -C out/mac
编译Windows
环境:windows10 Visual Studio 2019
需要安装Visual Studio 2019或者Visual Studio 2022,WebRTC M93(4577)之前的版本必须使用2019需要安装Win 10 SDK Debugging Tools For Windows
安装Visual Studio 2019时,要选择桌面C++开发功能以及MFC and ATL support。另外安装WIN10 SDK必须安装10.0.20348版本
WIN10 SDK还需要安装Debugging Tools,安装步骤为 控制面板 → 程序 → 程序和功能 → 选中“Windows Software Development Kit” → 变更 → Change → Check “Debugging Tools For Windows” → Change。
设置环境变量
set GYP_MSVS_VERSON=2019
set vs2019_install=C:\Program Files (x86)\Microsoft Visual Studio\2019\Community
set GYP_MSVS_OVERRIDE_PATH=C:\Program Files (x86)\Microsoft Visual Studio\2019\Community
set GYP_GENERATORS=msvs-ninja,ninja
set DEPOT_TOOLS_WIN_TOOLCHAIN=0
编译
gn gen out\Release-vs2019 --ide=vs2019 --args='rtc_include_tests=false rtc_build_examples=false is_debug=false target_os=\"win\" target_cpu=\"x64\" rtc_use_h264=true ffmpeg_branding=\"Chrome\" is_clang=true use_lld=false treat_warnings_as_errors=false use_custom_libcxx=false'
ninja -C out/Release-vs2019
编译Linux
./build/install-build-deps.sh
gcc编译arm64版(需要先安装编译工具)
build/linux/sysroot_scripts/install-sysroot.py --arch=arm64
gn gen out/Release-gcc --args='target_os="linux" target_cpu="arm64" is_debug=false is_component_build=false rtc_include_tests=false rtc_build_examples=true use_custom_libcxx=false cc="aarch64-none-linux-gnu-gcc" cxx="aarch64-none-linux-gnu-g++"'
ninja -C out/Release-gcc
常见问题
连接时候各种C++库连接不了问题
使用use_custom_libcxx=false这个是用来控制编译WebRtc时使用的c++库的,如果不加这个编译开关的话,WebRtc编译默认使用libc++来编译,而我们编译别的代码用的是libstdc++,这样在编译的过程中就会导致用到std::string的地方各种错误
但是不要用这个选项use_custom_libcxx_for_host=false不然会有各种库问题
加了use_custom_libcxx=false之后编译报错问题
Error:
../../audio/audio_send_stream.cc(343,25): error: object of type 'absl::optional<std::pair<TimeDelta, TimeDelta>>' cannot be assigned because its copy assignment operator is implicitly deleted
frame_length_range_ = encoder->GetFrameLengthRange();
^
../../third_party/abseil-cpp\absl/types/optional.h(279,13): note: explicitly defaulted function was implicitly deleted here
optional& operator=(const optional& src) = default;
^
../../third_party/abseil-cpp\absl/types/optional.h(119,18): note: copy assignment operator of 'optional<std::pair<webrtc::TimeDelta, webrtc::TimeDelta>>' is implicitly deleted because base class 'optional_internal::optional_data<pair<TimeDelta, TimeDelta>>' has a deleted copy assignment operator
class optional : private optional_internal::optional_data<T>,
^
../../third_party/abseil-cpp\absl/types/internal/optional.h(189,32): note: copy assignment operator of 'optional_data<std::pair<webrtc::TimeDelta, webrtc::TimeDelta>, true>' is implicitly deleted because base class 'optional_data_base<pair<TimeDelta, TimeDelta>>' has a deleted copy assignment operator
class optional_data<T, true> : public optional_data_base<T> {
^
../../third_party/abseil-cpp\absl/types/internal/optional.h(145,28): note: copy assignment operator of 'optional_data_base<std::pair<webrtc::TimeDelta, webrtc::TimeDelta>>' is implicitly deleted because base class 'optional_data_dtor_base<pair<TimeDelta, TimeDelta>>' has a deleted copy assignment operator
class optional_data_base : public optional_data_dtor_base<T> {
^
../../third_party/abseil-cpp\absl/types/internal/optional.h(131,7): note: copy assignment operator of 'optional_data_dtor_base<std::pair<webrtc::TimeDelta, webrtc::TimeDelta>, true>' is implicitly deleted because variant field 'data_' has a non-trivial copy assignment operator
T data_;
^
1 error generated.
[3099/3541] CXX obj/call/call/call.obj
修复方法可参考这里
部分编译参数说明
is_debug | 是否是Debug版,这里取false,表示编译Release版。 |
target_os | 平台类型,可以取值win、android、ios、linux等,这里取win,表示Windows平台。 |
target_cpu | 目标cpu架构,ios:arm,arm64,x64,x86,Android:arm,arm64,x86(32位),x64(64位),Windows:x86、x64。 |
is_component_build | 是否使用动态运行期库,这里取false,使用静态运行期库,Release版本将对应MT,Debug版将对应MTd。 |
proprietary_codecs | 是否使用版权编码,也就是H264,这里取true。 |
rtc_use_h264 | 是否使用H264,这里取true,注意Windows平台编码使用OpenH264,解码使用ffmpeg。 |
ffmpeg_branding | ffmpeg的分支名,这里采用Chrome的分支。 |
rtc_build_ssl | 是否编译BoringSSL,这里取false,因为后面我们要替换成OpenSSL。 |
rtc_ssl_root | OpenSSL的头文件路径,会被写到生成的ninja文件中。 |
use_custom_libcxx | webrtc默认使用自带的libcxx作为默认的c++标准库,如果不去除内置libcxx引用,链接时将与vc++的libcxx冲突。需加入use_custom_libcxx = false去除libcxx集成 |
rtti | 默认webrtc不开启rtti,如果在代码中使用typeid将引起链接失败 |
enable_iteartor_debuging | 默认webrtc这个标记为false,而vc++的debug版本默认为true,如果不增加这个开关,则需要在项目中手动关闭iteartor_debuging这个特性 |