Catalog
  1. 1. webrtc branch
  2. 2. google webrtc ci
  3. 3. 编译系统
  4. 4. 编译步骤
  5. 5. WebRTC GN 的参数
  6. 6. 生成的库在哪里
  7. 7. 参考
webrtc在Linux下源码编译的一些整理

这篇博客只记录在 linux 平台下使用 WebRtc 的过程,以及遇到的一些问题。并没有很系统的分析,不具备很强的参考性。

webrtc branch

remotes/branch-heads/4147 (m84)

附上 webrtc 分支名称查询链接 webrtc branchs

google webrtc ci

附上 google 在 linux 下的 webrtc ci 报告地址,每次更新后的 ci 报告都可以在这里看 Builder Linux64 Release (GCC)

编译系统

编译时用到一个工具 gn (generate ninja),可以看出来是用来创建 ninja 脚本,最终是使用 ninja 来构建。
涉及到几类文件:

  • .gn 做一些条件判断,比如根据配置选择是否包含某个模块,是编译可执行文件还是动态库, 可以理解成这个文件指导了如何生成编译过程。
  • .gni 相当于是配置文件, 定义变量、宏、配置项等,.gn 文件会使用到这里面的定义
  • DEPS 指定了包含路径

这些文件指导如何生成 ninja 的构建文件。

个人建议一定要熟悉这个编译系统,因为我遇到的问题,基本上都和他有关,多多少少都是这个模块没有生成库,那个开关没有打开等等。可以参考文末的 GN 手册。

编译步骤

1
2
3
4
5
6
7
8
9
10

// 这一步是生成 ninja 需要的构建脚本, 并且这个命令后面还可以跟参数
gn gen out/Default

//这里是我在 Ubuntu 下的构建命令, 有部分参数是从 google ci 里抄过来的, 这里的参数会在后面大概说明一下。
gn gen out/Default --args='dcheck_always_on = true is_clang = false is_debug = true rtc_include_tests = false target_cpu = "x64" treat_warnings_as_errors = false use_goma = false use_sysroot = false use_custom_libcxx=false rtc_enable_protobuf=false proprietary_codecs=true rtc_use_x11=false rtc_use_x11_extensions=false rtc_exclude_audio_processing_module=true rtc_use_dummy_audio_file_devices=false'


// 编译, 意思就是进入到 out/Default 中,然后编译项目。
ninja -C out/Default

WebRTC GN 的参数

通过命令可以导出所有的参数以及它们的值。

1
gn args out/Default --list

我这里说一下其中几个,因为在使用过程中遇到了一些问题。

  • is_clang 默认是 true,意味着使用 clang 编译。 而 linux 默认是 gcc 工具链,所以在使用时可能会有一些错误。 如果不注意的话,你写的项目使用 gcc 工具链编译,当链接时就会出现奇怪的问题。所以这里设置为 false,使用 gcc 来编译库
  • treat_warnings_as_errors 看字面意思,跟 gcc 编译选项差不错,就是不把警告当成错误,使得编译通过。使用 gcc 工具链编译时会出现一些错误,提示一些编译参数找不到,这个参数就是跳过这些警告。但是警告的原因我还没有来得及深究。
  • use_custom_libcxx 这个参数表示是否使用 libc++(可以去了解一些 libc++ 和 libstdc++ 的区别),由于是 Linux 环境开发,我们就直接用 libstdc++ ,不去折腾了。
  • is_linux_desktop 是否支持屏幕捕获
  • proprietary_codecs=true H264 支持
  • ffmpeg_branding=”Chrome” ffmpeg 对 H264 的支持
  • rtc_exclude_audio_processing_module 是否要排除音频处理模块(回声消除、降噪等效果)

生成的库在哪里

WebRtc 划分为了很多小的模块,并且官方的编译策略中每个模块会单独编译,最后将部分模块打包成一个库 libwebrtc.a。 所有的库都被放置在编译步骤中指定的 ninja 构建目录中了, 本文就是 out/Default/obj。

参考

WebRtc编译系统
GN手册

Author: 42
Link: http://blog.ikernel.cn/2020/03/13/webrtc%E5%9C%A8Linux%E4%B8%8B%E6%BA%90%E7%A0%81%E7%BC%96%E8%AF%91%E7%9A%84%E4%B8%80%E4%BA%9B%E6%95%B4%E7%90%86/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.

Comment