WebRTC 编译

前言

最近对 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版本

WebRTC 编译_第1张图片

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>' 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>' is implicitly deleted because base class 'optional_internal::optional_data>' has a deleted copy assignment operator
class optional : private optional_internal::optional_data,
                 ^
../../third_party/abseil-cpp\absl/types/internal/optional.h(189,32): note: copy assignment operator of 'optional_data, true>' is implicitly deleted because base class 'optional_data_base>' has a deleted copy assignment operator
class optional_data : public optional_data_base {
                               ^
../../third_party/abseil-cpp\absl/types/internal/optional.h(145,28): note: copy assignment operator of 'optional_data_base>' is implicitly deleted because base class 'optional_data_dtor_base>' has a deleted copy assignment operator
class optional_data_base : public optional_data_dtor_base {
                           ^
../../third_party/abseil-cpp\absl/types/internal/optional.h(131,7): note: copy assignment operator of 'optional_data_dtor_base, 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这个特性

你可能感兴趣的:(webrtc,webrtc)