MacOS下C++使用WebRTC注意事项及问题解决

 

背景

近一段时间在开发MacOS下视频相关app,之前一直通过WebRTC.framework的形式引用webrtc的objc接口, 由于新的特性不仅需要oc接口,还需要使用WebRTC C++接口,因此需改成通过静态库链接webrtc.

 

碰到的问题与解决

对于iOS/macOS平台,开启openh264,去除test,使用如下命令

gn gen out/mac --args="proprietary_codecs=true use_openh264=true ffmpeg_branding=\"Chrome\" rtc_include_tests=false"ninja -C out/mac

可以生成WebRTC.framework以及对应的C++静态库libwebrtc.a. 但是当我尝试直接链接出来的libwebrtc.a时,编译器报出下面两类链接问题

1, typeid符号找不到

2,所有objective-c符号

对于第一个问题加上

use_rtti=true

开启RTTI后可以解决,对于第二个问题,经过查看编译产物发现,在out/mac/obj/sdk下有若干.a库

libbase_native_additions_objc.a
libbase_objc.a
libcallback_logger_objc.a
libdefault_codec_factory_objc.a
libfile_logger_objc.a
libhelpers_objc.a
libmediaconstraints_objc.a
libmediasource_objc.a
libmetal_objc.a
libnative_api.a
libnative_video.a
libpeerconnectionfactory_base_objc.a
libui_objc.a
libvideo_objc.a
libvideo_toolbox_cc.a
libvideocapture_objc.a
libvideocodec_objc.a
libvideoframebuffer_objc.a
libvideorendereradapter_objc.a
libvideosource_objc.a
libvideotoolbox_objc.a
libvp8.a
libvp9.a
libvpx_codec_constants.a
libwrapped_native_codec_objc.a

猜测objective-c的符号应该是没有被编译进入libwebrc.a,而是在out/mac/obj/sdk这些库中。将全部这些库增加到链接目录,又发现有重复符号。去除libbase_objc.a和libhelper_objc.a后解决。

解决这些问题后,可以编译链接成功。但是运行的时候会崩溃。查看调用堆栈,崩溃代码在std::string内部。怀疑是标准库冲突引起的,查阅相关资料发现webrtc默认使用自带的libc++库,由于xcode默认也用libc++,因此接口是兼容的,但是内部实现可能不同,导致运行崩溃。加上

use_custom_libcxx=false

这个编译选项后,成功运行。

 

总结macos嵌入webrtc流程

1,编译

gn gen out/mac --args="use_rtti=true use_custom_libcxx=false proprietary_codecs=true use_openh264=true ffmpeg_branding=\"Chrome\" rtc_include_tests=false"
ninja -C out/mac

2, 导出头文件

3,引用

libwebrtc.a
libbase_native_additions_objc.a
libcallback_logger_objc.a
libdefault_codec_factory_objc.a
libfile_logger_objc.a
libmediaconstraints_objc.a
libmediasource_objc.a
libmetal_objc.a
libnative_api.a
libnative_video.a
libpeerconnectionfactory_base_objc.a
libui_objc.a
libvideo_objc.a
libvideo_toolbox_cc.a
libvideocapture_objc.a
libvideocodec_objc.a
libvideoframebuffer_objc.a
libvideorendereradapter_objc.a
libvideosource_objc.a
libvideotoolbox_objc.a
libvp8.a
libvp9.a
libvpx_codec_constants.a
libwrapped_native_codec_objc.a

关于MacOS下C++使用WebRTC注意事项的文章就介绍至此,更多相关C++使用WebRTC内容请搜索编程宝库以前的文章,希望以后支持编程宝库

 一、本通讯录要实现的功能通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址通讯录可执行的操作如下:添加联系人信息删除指定联系人信息查找指定联系人信息修改指定联系 ...