c++ - 如何在VS 2019或CLion Project中使用 "webrtc.lib"静态库?

标签 c++ windows cmake windows-runtime webrtc

我一直在为 Windows 平台开发 WebRtc。我想开发基于 webrtc 的桌面应用程序。我正在从头开始学习和更好地理解。

WebRtc库编译正常流程:

我最初是从 ( Getting Started with WinRTC ) 开始的。我遵循了正常的编译过程。之后,我尝试了多种方法来生成 webrtc 的项目文件,例如;

1.默认

gn gen --ide=vs2019 out/Default

2.自定义标志

gn gen --ide=vs2019 out/Default --args="use_rtti=true is_clang=false rtc_build_tools=false rtc_include_tests=false rtc_build_examples=false"

3.自定义标志

gn gen --ide=vs2019 out\Default --filters=//:webrtc "--args=is_debug=true use_lld=false is_clang=false rtc_include_tests=true rtc_build_tools=true rtc_win_video_capture_winrt=true target_cpu=\"x86\" target_os=\"win\" rtc_build_examples=true rtc_win_use_mf_h264=true enable_libaom=true rtc_enable_protobuf=true"

对于构建过程,我遵循了这些方法:

使用命令行:

运行以下命令从命令行构建打补丁的 WebRTC。

ninja -C out\Default\x64

使用 Visual Studio 2019:

使用以下命令打开生成的 Visual Studio 解决方案:

devenv out\Default\x64\all.sln

我已经尝试了几乎所有可用的组合来生成构建文件和构建 webrtc.lib 静态库。我已经成功地为这两种架构编译了静态 webrtc 库 webrtc.lib

  1. x64(默认 Arch)(用于调试和发布)
  2. x86(自定义架构)(用于调试和发布)

WebRtc Static Library Description

重要提示:

I have successfully managed to run peerconnection_server.exe and peerconnection_client.exe on windows. These examples are successfully running on localhost.


使用 VS2019:

之后,我使用 VS2019 创建了一个新的基于控制台的项目来使用生成的二进制文件并按照以下步骤操作;

  1. 添加包含文件夹

Configuration Properties → C/C++ → General → Additional Include Directories 并添加以下路径:

c:\webrtc\src
c:\webrtc\src\out\Default\$(Configuration)\$(PlatformTarget)\gen
c:\webrtc\src\third_party\abseil-cpp
c:\webrtc\src\third_party\libyuv\include
  1. 预处理器宏:

点击 Preprocessor → Preprocessor Definitions 并添加以下定义:

USE_AURA=1;_HAS_EXCEPTIONS=0;__STD_C;_CRT_RAND_S;_CRT_SECURE_NO_DEPRECATE;_SCL_SECURE_NO_DEPRECATE;_ATL_NO_OPENGL;_WINDOWS;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;PSAPI_VERSION=2;WIN32;_SECURE_ATL;WINUWP;__WRL_NO_DEFAULT_LIB__;WINAPI_FAMILY=WINAPI_FAMILY_PC_APP;WIN10=_WIN32_WINNT_WIN10;WIN32_LEAN_AND_MEAN;NOMINMAX;_UNICODE;UNICODE;NTDDI_VERSION=NTDDI_WIN10_RS2;_WIN32_WINNT=0x0A00;WINVER=0x0A00;NDEBUG;NVALGRIND;DYNAMIC_ANNOTATIONS_ENABLED=0;WEBRTC_ENABLE_PROTOBUF=0;WEBRTC_INCLUDE_INTERNAL_AUDIO_DEVICE;RTC_ENABLE_VP9;HAVE_SCTP;WEBRTC_LIBRARY_IMPL;WEBRTC_NON_STATIC_TRACE_EVENT_HANDLERS=0;WEBRTC_WIN;ABSL_ALLOCATOR_NOTHROW=1;HAVE_SCTP;WEBRTC_VIDEO_CAPTURE_WINRT
  1. 链接器附加库路径:

点击 Linker → General → Additional Library Directories 并添加以下路径:

c:\webrtc\src\out\Default\$(Configuration)\$(PlatformTarget)\obj
  1. WebRTC 库名称:

点击 Input → Additional Dependencies 并添加以下文件名:

webrtc.lib

现在,当我简单地使用这个基本实现时,例如;

#include <iostream>

#include "rtc_base/thread.h"
#include "rtc_base/logging.h"
#include "rtc_base/ssl_adapter.h"
#include "rtc_base/arraysize.h"
#include "rtc_base/net_helpers.h"
#include "rtc_base/string_utils.h"
#include "rtc_base/signal_thread.h"


int main(int argc, char** argv) {

    rtc::InitializeSSL();

    return 0;
}

程序充斥着两种类型的错误:

1. LNK2038  mismatch detected for 'RuntimeLibrary': value 'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug'

还有一个是

2. LNK2038  mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2'

也可以看as given;在这里,我将 webrtc.lib 与配置 (Release) 和平台 (x64) 一起使用。

Release Configuration


使用 Clion-2021.2.1 和 CMAKE:

在这里,我使用了 webrtc.lib 和配置 (Release) 和平台 (x86)

CMakeLists.txt 为;

cmake_minimum_required(VERSION 3.20)
project(NewRtc)

set(CMAKE_CXX_STANDARD 14)


#set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
#set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")

include_directories(
        "c:/webrtc/src"
        "C:/webrtc/src/out/Default/x86/obj"
        "c:/webrtc/src/third_party/abseil-cpp"
        "c:/webrtc/src/third_party/libyuv/include"
)

# error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in main.obj
# Solution:
#1. _ITERATOR_DEBUG_LEVEL = 0 // disabled (for release builds)
#2. _ITERATOR_DEBUG_LEVEL = 1 // enabled (if _SECURE_SCL is defined)
#3. _ITERATOR_DEBUG_LEVEL = 2 // enabled (for debug builds)

add_definitions(
        -D_ITERATOR_DEBUG_LEVEL=0
        -DUSE_AURA=1
        -D_HAS_EXCEPTIONS=0
        -D__STD_C
        -D_CRT_RAND_S
        -D_CRT_SECURE_NO_DEPRECATE
        -D_SCL_SECURE_NO_DEPRECATE
        -D_ATL_NO_OPENGL
        -D_WINDOWS
        -DCERT_CHAIN_PARA_HAS_EXTRA_FIELDS
        -DPSAPI_VERSION=2
        -DWIN32
        -D_SECURE_ATL
        -DWINUWP
        -D__WRL_NO_DEFAULT_LIB__
        -DWINAPI_FAMILY=WINAPI_FAMILY_PC_APP
        -DWIN10=_WIN32_WINNT_WIN10
        -DWIN32_LEAN_AND_MEAN
        -DNOMINMAX
        -D_UNICODE
        -DUNICODE
        -DNTDDI_VERSION=NTDDI_WIN10_RS2
        -D_WIN32_WINNT=0x0A00
        -DWINVER=0x0A00
        -DNDEBUG
        -DNVALGRIND
        -DDYNAMIC_ANNOTATIONS_ENABLED=0
        -DWEBRTC_ENABLE_PROTOBUF=0
        -DWEBRTC_INCLUDE_INTERNAL_AUDIO_DEVICE
        -DRTC_ENABLE_VP9
        -DHAVE_SCTP
        -DWEBRTC_LIBRARY_IMPL
        -DWEBRTC_NON_STATIC_TRACE_EVENT_HANDLERS=0
        -DWEBRTC_WIN
        -DABSL_ALLOCATOR_NOTHROW=1
        -DHAVE_SCTP
        -DWEBRTC_VIDEO_CAPTURE_WINRT)



#set(CMAKE_CXX_FLAGS_RELEASE "/MT")
#set(CMAKE_CXX_FLAGS_DEBUG "/MTd")

set(-Dwebrtc.lib)
add_executable(NewRtc main.cpp)
set_property(TARGET NewRtc PROPERTY
        MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
target_link_libraries(NewRtc

        PRIVATE "C:/webrtc/src/out/Default/x86/obj/webrtc.lib"

        )

但是当我简单地构建项目时,这个错误出现在每个 WebRtc 的实现中。在这里你可以看到:

Clion Error Description

请帮助我如何在使用 VS2019 或 Clion 的 Windows 上的任何项目中简单地使用 webrtc 库。我正在尝试解决这些问题,我尝试了多种解决堆栈溢出和其他社区使用 cmake 或在项目属性中添加标志的解决方案,例如;

我已尽力解释完整的解决方案和相关问题,以便有人可以相应地帮助我。

最佳答案

好吧,伙计们,在花了将近 12 个小时的研究之后,我今天过得很愉快。我已经完全弄清楚我在 (VS2019/Clion) 中的开发设置有什么问题,在可执行项目中使用静态 webrtc.lib

I must thank Mr.@drescherjm for his support on my question. It's really appreciated it.

库编译到它在 VS2019/Clion 项目中的使用,一切都朝着积极的方向发展。实际上,.netCore 项目中的 webrtc 开发需要一些有用的库才能在您的项目中正常使用 webrtc.lib

这是您在开发过程中必须使用的库列表,例如;


对于 Windows:

为 Windows 构建 WebRtc 项目所需的模块如下;

WS2_32 secur32.lib winmm.lib dmoguids.lib wmcodecdspuuid.lib msdmo.lib Strmiids.lib

对于 Linux:

为 Linux 构建 WebRtc 项目所需的模块如下;

Secur32 Msdmo Winmm Dmoguids wmcodecdspuuid

这些是重要的库,因为 webrtc 点对点通信主要是在 C/C++ 中为 Linux 广泛实现 socket 编程 以及 Windows 操作系统。

如何在项目中使用这些库:

  • 使用 CmakeLists.txt
  • 使用#pragma关键字

对于 CMakeLists.txt:

您可以简单地将这些模块包含在 target_link_libraries() 中,您还可以在其中链接 webrtc.lib,例如;

add_executable(NewRtc main.cpp)

set_property(TARGET NewRtc PROPERTY
        MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")

target_link_libraries(NewRtc

    PRIVATE "{$LIB_PATH}/webrtc.lib"

    # Required Modules for building projects
    WS2_32 secur32.lib winmm.lib dmoguids.lib wmcodecdspuuid.lib msdmo.lib Strmiids.lib

    )

对于#Pragma 关键字:

您可以在可执行文件中使用#pragma 关键字直接包含所有必需的库(在我的例子中是main.cpp),例如;

# pragma comment(lib, "webrtc.lib")
# pragma comment(lib,"WS2_32")
# pragma comment(lib, "secur32.lib")
# pragma comment(lib, "winmm.lib")
# pragma comment(lib, "dmoguids.lib")
# pragma comment(lib, "wmcodecdspuuid.lib")
# pragma comment(lib, "msdmo.lib")
# pragma comment(lib, "Strmiids.lib")

这两个程序将 100% 服务于相同的目的。我希望它能对某人有所帮助。

关于c++ - 如何在VS 2019或CLion Project中使用 "webrtc.lib"静态库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69235936/

相关文章:

c# - AsyncCallback 没有被第二次调用

c - 为什么 C 程序在取消引用数组指针时会崩溃?

CMake - 强制 find_package 更新缓存变量

CMockery 模拟,重复符号错误

cmake - cmake中是否有用于模块开发的交互式shell?

c++ - 临时 C++ 对象是左值吗?

c# - 使用 OpenSSL 兼容格式在 C# 中加密,在 Poco 中解密

PHP 正则表达式将新行限制为最多两个

c++ - 制作复制构造函数

c++ - 我应该在服务模板中的什么地方添加自己的代码?