问题:如何在C++中链接WebRTC库的[最小化]部分?注意:我正在使用Qt平台。
链接到Google的WebRTC实现不是一个简单的任务,因为:
解决方案1
解决此问题的一种方法是将WebRTC包装在动态库中,其中所有WebRTC符号都被隐藏。此库必须包含您的实现以使用offers/answers/candidates等进行工作。并创建纯C接口来包装此功能。由于只有此接口将从库中导出,因此您不会遇到符号冲突和ABI不兼容性。 要创建这样的动态库,我发现最简单的方法是修改一些BUILD.gn文件,将我的实现添加到WebRTC代码库中,并在GN中构建它,即在整个WebRTC库内部构建它。
以下是添加自定义内容到GN构建系统的示例步骤:
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目录中获得lib_name_of_your_dir.so文件。在WebRTC构建系统的默认规则下,该库中的所有符号均被隐藏,因此您需要导出自己的符号:为此,请使用__attribute__((visibility("default")))
标记您的方法/类。
解决方案2
另一种解决方案是不包含编译器和标准库来编译WebRTC,这可能有些棘手,因为它要求您深入了解GN构建设置。但是,这种方法有一个优点:它允许使用C++接口而不是纯C,因为库将是ABI兼容的。
P.S. 要了解如何处理信令并创建点对点连接,您可以参考此示例:https://webrtc.googlesource.com/src/+/refs/heads/main/examples/peerconnection
我们有三个可用于webrtc的平台。
1- WinRTC(用于制作Windows和桌面应用程序的库)
2- Android应用程序的Webrtc(需要Ubuntu)
3- IOS的Webrtc(需要MACOS)
对于所有这些平台,都有不同的设置项目的方法。 您正在使用用于Windows的Webrtc教程,称为winRTC。
在Linux中,您只能为Android应用程序制作webrtc libs,并且该方法在此链接中提供。
https://github.com/mail2chromium/Compile_WebRTC_Library_For_Android
********************* 集成 ******************
如果要在 Android 应用程序中集成 WebRTC 库,您需要应用一个名为的标志。
implementation(name: 'library_Name', ext: 'Extension like .aar,.so,.a')
首先,您需要从官方代码网站构建libwebrtc.a
静态库。运行ninja -C out/Default
后,您将在<your webrtc source dir>/webrtc-checkout/src/out/Default/obj/libwebrtc.a
中获得libwebrtc.a。
然后,在您的CMakeLists.txt中添加以下包含目录:
target_include_directories(WebRTC SYSTEM PRIVATE ${WEBRTC_SRC})
target_include_directories(WebRTC SYSTEM PRIVATE ${WEBRTC_SRC}/buildtools/third_party/libc++/trunk/include)
target_include_directories(WebRTC SYSTEM PRIVATE ${WEBRTC_SRC}/third_party/perfetto/buildtools/libcxx_config)
target_include_directories(WebRTC SYSTEM PRIVATE ${WEBRTC_SRC}/third_party/abseil-cpp/)
target_include_directories(WebRTC SYSTEM PRIVATE ${WEBRTC_SRC}/third_party/jsoncpp/source/include/)
${WEBRTC_SRC}
是您的 /webrtc-checkout/src
目录的绝对路径。
在添加包含目录后,像这样添加链接库:
target_link_libraries(WebRTC
PRIVATE
${WEBRTC_SRC}/out/Debug/obj/libwebrtc.a
)
完成了!
我在我的项目中也使用了谷歌的webrtc源代码,并且能够编译和启动webrtc调试版本,没有任何问题。点击这里。