如何将部分WebRTC作为静电/动态库与现有的C++代码集成?

我可以从它的official code site下载&;安装Ubuntu中的WebRTC。现在,我打算在我们的服务器中使用它的某些C++API来创建P2P端点和加密/解密VoIP数据。但没有关于如何将该模块用作静电或动态链接库的指导原则。

问题:如何在C++中链接WebRTC库的[最好是最少]部分?
注意:我使用的是Qt平台。


解决方案

链接到谷歌的WebRTC实现并非易事,因为:

    它有自己的编译器和stdlib"工具链"(例如, 对于Ubuntu,它使用clang和libc++)。这可能是不相容的 使用ABI级别的可执行文件。另外,如果您使用的是libstdc++(AFAIK Qt 执行此操作),则不能将两个库链接在一个单元中。
  1. 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

相关文章