当前位置:   article > 正文

WebRTC 编译

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

  1. vim ~/.bashrc
  2. export DEPOT_TOOLS_PATH=/Users/hele/Documents/software/depot_tools
  3. export PATH=${PATH}:${DEPOT_TOOLS_PATH}
  4. source ~/.bashrc

windows

https://storage.googleapis.com/chrome-infra/depot_tools.zip下载并解压缩到某处,设置环境变量。csdn下载地址:depot_tools.zip

编译Android

编译 Android 需要使用 Linux 环境,这里用的是Ubuntu20.04系统。

  1. # 创建并切换到 ~/webrtc
  2. $ mkdir ~/webrtc
  3. $ cd ~/webrtc
  4. # 拉取并同步 WebRTC 的最新代码
  5. $ fetch --nohooks webrtc_android
  6. $ gclient sync

默认下载的 master 分支,但我们一般不直接使用 master,而是应该切换到一个 release 版本。webrtc版本号和分支关系可以查看:https://chromiumdash.appspot.com/branches

  1. $ cd ~/webrtc/src
  2. $ git checkout -b m107 branch-heads/5304
  3. $ gclient sync

编译源码

  1. cd src
  2. #安装依赖
  3. ./build/install-build-deps.sh
  4. ./build/install-build-deps-android.sh
  5. #配置环境变量
  6. . build/android/envsetup.sh

编译

  1. gn gen out/android "--args=is_debug=false target_os=\"android\" target_cpu=\"arm64\""
  2. 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

编译

  1. ios
  2. tools_webrtc/ios/build_ios_libs.py
  3. ./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
  4. mac
  5. 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
  6. 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。

设置环境变量

  1. set GYP_MSVS_VERSON=2019
  2. set vs2019_install=C:\Program Files (x86)\Microsoft Visual Studio\2019\Community
  3. set GYP_MSVS_OVERRIDE_PATH=C:\Program Files (x86)\Microsoft Visual Studio\2019\Community
  4. set GYP_GENERATORS=msvs-ninja,ninja
  5. set DEPOT_TOOLS_WIN_TOOLCHAIN=0

编译

  1. 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'
  2. 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之后编译报错问题

  1. Error:
  2. ../../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
  3. frame_length_range_ = encoder->GetFrameLengthRange();
  4. ^
  5. ../../third_party/abseil-cpp\absl/types/optional.h(279,13): note: explicitly defaulted function was implicitly deleted here
  6. optional& operator=(const optional& src) = default;
  7. ^
  8. ../../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
  9. class optional : private optional_internal::optional_data<T>,
  10. ^
  11. ../../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
  12. class optional_data<T, true> : public optional_data_base<T> {
  13. ^
  14. ../../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
  15. class optional_data_base : public optional_data_dtor_base<T> {
  16. ^
  17. ../../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
  18. T data_;
  19. ^
  20. 1 error generated.
  21. [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这个特性

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/797580
推荐阅读
相关标签
  

闽ICP备14008679号