網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
背景
近一段時(shí)間在開(kāi)發(fā)MacOS下視頻相關(guān)app,之前一直通過(guò)WebRTC.framework的形式引用webrtc的objc接口, 由于新的特性不僅需要oc接口,還需要使用WebRTC C++接口,因此需改成通過(guò)靜態(tài)庫(kù)鏈接webrtc.
碰到的問(wèn)題與解決
對(duì)于iOS/macOS平臺(tái),開(kāi)啟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以及對(duì)應(yīng)的C++靜態(tài)庫(kù)libwebrtc.a. 但是當(dāng)我嘗試直接鏈接出來(lái)的libwebrtc.a時(shí),編譯器報(bào)出下面兩類鏈接問(wèn)題
1, typeid符號(hào)找不到
2,所有objective-c符號(hào)
對(duì)于第一個(gè)問(wèn)題加上
use_rtti=true
開(kāi)啟RTTI后可以解決,對(duì)于第二個(gè)問(wèn)題,經(jīng)過(guò)查看編譯產(chǎn)物發(fā)現(xiàn),在out/mac/obj/sdk下有若干.a庫(kù)
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
猜測(cè)objective-c的符號(hào)應(yīng)該是沒(méi)有被編譯進(jìn)入libwebrc.a,而是在out/mac/obj/sdk這些庫(kù)中。將全部這些庫(kù)增加到鏈接目錄,又發(fā)現(xiàn)有重復(fù)符號(hào)。去除libbase_objc.a和libhelper_objc.a后解決。
解決這些問(wèn)題后,可以編譯鏈接成功。但是運(yùn)行的時(shí)候會(huì)崩潰。查看調(diào)用堆棧,崩潰代碼在std::string內(nèi)部。懷疑是標(biāo)準(zhǔn)庫(kù)沖突引起的,查閱相關(guān)資料發(fā)現(xiàn)webrtc默認(rèn)使用自帶的libc++庫(kù),由于xcode默認(rèn)也用libc++,因此接口是兼容的,但是內(nèi)部實(shí)現(xiàn)可能不同,導(dǎo)致運(yùn)行崩潰。加上
use_custom_libcxx=false
這個(gè)編譯選項(xiàng)后,成功運(yùn)行。
總結(jié)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, 導(dǎo)出頭文件
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
原文鏈接:https://www.cnblogs.com/ngxianyu/p/11412612.html
相關(guān)推薦
- 2022-11-17 C++11中異常處理機(jī)制詳解_C 語(yǔ)言
- 2022-12-13 Android?Loop機(jī)制中Looper與handler詳細(xì)分析_Android
- 2023-07-05 React hooks之useCallback的使用與性能分析
- 2022-08-05 Winform窗體中打開(kāi)PDF文件的三種方式_C#教程
- 2022-04-17 python讀取文件夾下所有文件
- 2022-12-27 Docker使用Calico網(wǎng)絡(luò)模式配置及問(wèn)題處理方法_docker
- 2023-07-13 css對(duì)盒模型的理解
- 2024-01-14 npm install時(shí) cannot read properties of null的問(wèn)題
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支