本文介绍了如何将部分WebRTC作为静电/动态库与现有的C++代码集成?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我可以从它的official code site下载&;安装Ubuntu中的WebRTC。现在,我打算在我们的服务器中使用它的某些C++API来创建P2P端点和加密/解密VoIP数据。但没有关于如何将该模块用作静电或动态链接库的指导原则。
问题:如何在C++中链接WebRTC库的[最好是最少]部分?
注意:我使用的是Qt平台。
推荐答案
链接到谷歌的WebRTC实现并非易事,因为:
-
它有自己的编译器和stdlib"工具链"(例如,
对于Ubuntu,它使用clang和libc++)。这可能是不相容的
使用ABI级别的可执行文件。另外,如果您使用的是libstdc++(AFAIK Qt
执行此操作),则不能将两个库链接在一个单元中。
- WebRTC使用BoringSSL,如果您的应用程序使用OpenSSL,则它 与前一个std lib类似的问题:您有冲突 符号。
解决方案1
解决此问题的方法之一是将WebRTC包装在所有WebRTC符号都隐藏的动态库中。这个库必须包含用于处理提议/答案/应聘者等的实现,并制作包装此功能的纯C接口。因为只有这个接口可以从库中导出,所以不会有符号冲突和ABI不兼容。 要创建这样的动态库,我发现最简单的方法是修改一些BUILD.gn文件,将我的实现添加到WebRTC代码库,并使用GN构建它,即在整个WebRTC库中。这些步骤描述了向GN生成系统添加自定义的示例:
- 将目录添加到根src目录(即根BUILD.gn所在的目录)
- 在新目录内创建文件BUILD.gn
- 在根BUILD.gn文件的find部分
rtc_static_library("webrtc")
及其deps
部分添加新目录的名称
这是您的BUILD.gn文件的模板:
rtc_shared_library("name_of_your_dir") {
deps = [
"../api:create_peerconnection_factory",
"../api:libjingle_peerconnection_api",
"../api:media_stream_interface",
"../api/audio_codecs:builtin_audio_decoder_factory",
"../api/audio_codecs:builtin_audio_encoder_factory",
"../api/video_codecs:builtin_video_decoder_factory",
"../api/video:video_frame",
"../media:rtc_audio_video",
"../media:rtc_internal_video_codecs",
"../media:rtc_media",
"../media:rtc_media_base",
"../modules/audio_device",
"../pc:peerconnection",
"../rtc_base", ]
# Add your source files here
sources = [
# "name_of_your_dir/header.h",
# "name_of_your_dir/impl.cc"
]
}
在成功构建后的结果中,您将在out dir中获得lib_name_of_your_dir.so文件。在该库中,根据WebRTC构建系统中默认规则,所有符号都是隐藏的,因此您需要导出您的符号:为此,请使用__attribute__((visibility("default")))
标记您的方法/类
解决方案2
另一种解决方案是编译WebRTC时不包含编译器和STD库,这可能很棘手,因为它需要您深入了解GN构建设置。但是这种方法有一个优点:它允许使用C++接口而不是纯C,因为库将与ABI兼容。
附注:要了解如何使用信令并创建点对点连接,可以参考此示例:https://webrtc.googlesource.com/src/+/refs/heads/main/examples/peerconnection
这篇关于如何将部分WebRTC作为静电/动态库与现有的C++代码集成?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!