编译Webrtc的IOS Static Library

现在网上发布的Webrtc都是Embeded Framework,Delphi没法编译使用这种Framework,所以只好自己编译

1.gn gen out/Release-arm -args='target_os="ios" target_cpu="arm" is_component_build=false is_debug=false ios_enable_code_signing=false'

2.ninja -C out/Release-arm webrtc

注意生成的libwebrtc.a里面有很多的debug symbol,生成的文件很大,要strip一下

另外,要用lipo生成armv7 , arm64的fat library。

2019/4/21追记

现在最新的Webrtc ios,应该是2018年3月6号的时候, 移除了编译静态library的功能,晕死.参考下面的ticket,
https://bugs.chromium.org/p/webrtc/issues/detail?id=10008
然后EMB这傻叉不支持Embed Dynamic Framework,有人题了一个ticket给emb,但是我怀疑EMB是否有足够的资源去实现这一功能.

我们只能使用第三方的编译的静态库了,参考下面的url
https://stackoverflow.com/questions/47294844/webrtc-static-library-on-ios

2019/4/21追记
修改src/sdk/build.gn文件 添加下面的静态库编译Target,编译即可.重要的是complete_static_lib = true这句话(complete_static_lib: [boolean] Links all deps into a static library.),参考下面的文章
https://www.jianshu.com/p/994f9f6c9874, 注意我的修改是基于rev27697的,如果是其他版本,需要基于其他版本修改

  1. rtc_static_library("rtc_sdk_objc") {
  2. complete_static_lib = true
  3.  
  4. deps = [
  5. ":rtc_sdk_peerconnection_objc",
  6. "//webrtc/system_wrappers:field_trial_default",
  7. "//webrtc/system_wrappers:metrics_default",
  8. ]
  9.  
  10. libs = [
  11. "AVFoundation.framework",
  12. "AudioToolbox.framework",
  13. "CoreGraphics.framework",
  14. "CoreMedia.framework",
  15. "GLKit.framework",
  16. "VideoToolbox.framework",
  17. ]
  18.  
  19. configs += [
  20. "..:common_objc",
  21. "//build/config/compiler:enable_arc",
  22. ]
  23.  
  24. public_configs = [ ":rtc_sdk_common_objc_config" ]
  25.  
  26. if (is_clang) {
  27. # Suppress warnings from the Chromium Clang plugins.
  28. # See <a href="http://code.google.com/p/webrtc/issues/detail?id=163" title="http://code.google.com/p/webrtc/issues/detail?id=163">http://code.google.com/p/webrtc/issues/detail?id=163</a> for details.
  29. #configs -= [ "//build/config/clang:find_bad_constructs" ]
  30. }
  31. }

编译命令gn gen out/Release-arm64 --args='target_os="ios" target_cpu="arm64" is_component_build=false is_debug=false ios_enable_code_signing=false'

ninja -C out/Release-arm64
会生成obj/libwebrtc.a文件

再多说两句,static和dynamic的区别就是我们可以从static生成dynamic,反过来则不行,因为dynamic多了一个link的步骤,会填写符号表的地址,并删除一些Object文件的信息,所以没法反过来生成static的library.

2020/05/02 追记

编译mac 的library,需要撤销上面对build.gn的修改,原始文件保存为src/sdk/BUILD.gn copy
然后执行下面命令
gn gen out/Mac --args='target_os="mac" target_cpu="x64" is_component_build=false is_debug=false rtc_include_tests=true'

ninja -C out/Mac

注意针对Mac,静态库的编译规则要稍微改一下

  1. rtc_static_library("rtc_sdk_objc") {
  2. complete_static_lib = true
  3. deps = [
  4. ":base_objc",
  5. ":default_codec_factory_objc",
  6. ":native_api",
  7. ":native_video",
  8. ":peerconnectionfactory_base_objc",
  9. ":ui_objc",
  10. ":videocapture_objc",
  11. ":videocodec_objc",
  12. ":videotoolbox_objc",
  13. "../rtc_base:rtc_base_approved",
  14. ]
  15. if (rtc_use_metal_rendering) {
  16. deps += [ ":metal_objc" ]
  17. }
  18. if (!build_with_chromium) {
  19. deps += [
  20. ":callback_logger_objc",
  21. ":file_logger_objc",
  22. ]
  23. }
  24.  
  25. libs = [
  26. "AVFoundation.framework",
  27. "CoreGraphics.framework",
  28. "CoreMedia.framework",
  29. "OpenGL.framework",
  30. ]
  31.  
  32. configs += [
  33. "..:common_objc",
  34. # ":used_from_extension",
  35. ]
  36.  
  37. public_configs = [ ":common_config_objc" ]
  38. }

并且要把rtc_sdk_objc添加到framework编译依赖里面,否则相应的library并不会被编译

  1. if (is_mac) {
  2. mac_framework_bundle_with_umbrella_header("mac_framework_objc") {
  3. info_plist = "objc/Info.plist"
  4. output_name = "WebRTC"
  5.  
  6. ...
  7.  
  8. deps = [
  9. ":base_objc",
  10. ":default_codec_factory_objc",
  11. ":rtc_sdk_objc",

编译后,将output/Mac/obj/sdk/librtc_sdk_objc.a获取就可以了
注意args.gn中药添加use_custom_libcxx=false,否则Mac上libc++部分的代码会crash

gn args out/Mac list可以得到支持的args的列表