把webrtc(Master && M79)的peerconnection/client转换成vs2019工程
1、用VS2019创建一个空白C++的控制台工程,设置相关的包含目录及库目录
2、设置正确的配置平台:Release X64
3、copy相关的代码到当前工程目录下,添加相关文件到当前工程中,
修改相关代码中的include头文件:
“examples/peerconnection/client/xxx.h”修改为当前会目录“xxx.h”
4、C/C++设置预处理器定义
4.1、M79的预处理器定义为:
NDEBUG;WEBRTC_WIN;WIN32_LEAN_AND_MEAN;NOMINMAX;WIN32;USE_AURA=1;NO_TCMALLOC;FULL_SAFE_BROWSING;SAFE_BROWSING_CSD;SAFE_BROWSING_DB_LOCAL;CHROMIUM_BUILD;_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;_SECURE_ATL;_USING_V110_SDK71_;WINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP;_UNICODE;UNICODE;NTDDI_VERSION=NTDDI_WIN10_RS2;_WIN32_WINNT=0x0A00;WINVER=0x0A00;NVALGRIND;DYNAMIC_ANNOTATIONS_ENABLED=0;WEBRTC_ENABLE_PROTOBUF=1;WEBRTC_INCLUDE_INTERNAL_AUDIO_DEVICE;RTC_ENABLE_VP9;HAVE_SCTP;WEBRTC_NON_STATIC_TRACE_EVENT_HANDLERS=1;ABSL_ALLOCATOR_NOTHROW=1;HAVE_WEBRTC_VIDEO;
4.2、Master的预处理器定义为:
NDEBUG;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;WINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP;WIN32_LEAN_AND_MEAN;NOMINMAX;_UNICODE;UNICODE;NTDDI_VERSION=NTDDI_WIN10_VB;_WIN32_WINNT=0x0A00;WINVER=0x0A00;DYNAMIC_ANNOTATIONS_ENABLED=1;_HAS_ITERATOR_DEBUGGING=0;WEBRTC_ENABLE_PROTOBUF=1;WEBRTC_INCLUDE_INTERNAL_AUDIO_DEVICE;RTC_ENABLE_VP9;WEBRTC_HAVE_SCTP;WEBRTC_NON_STATIC_TRACE_EVENT_HANDLERS=1;WEBRTC_WIN;ABSL_ALLOCATOR_NOTHROW=1;_ENABLE_EXTENDED_ALIGNED_STORAGE;ABSL_FLAGS_STRIP_NAMES=0;HAVE_WEBRTC_VIDEO;
多吧,从peerconnection_client.ninja中copy过来的
5、C/C++设置 运行库:
/MT(release)
/MTD(debug)
6、链接器-->输入-->附加依赖库为:也是从peerconnection_client.ninja中copy过来的
webrtc.lib;utility.lib;winmm.lib;dbghelp.lib;dnsapi.lib;msimg32.lib;shlwapi.lib;usp10.lib;version.lib;wininet.lib;ws2_32.lib;delayimp.lib;crypt32.lib;iphlpapi.lib;secur32.lib;dmoguids.lib;wmcodecdspuuid.lib;amstrmid.lib;msdmo.lib;strmiids.lib;webrtctest.lib;
其中webrtctest.lib为自定义生成库,主要是webrtc中test工程中的obj和jsoncpp工程中的obj生成(最后再说明一下步骤)
7、链接器-->系统-->子系统:窗口 (/SUBSYSTEM:WINDOWS)
8、编译尝试了,一般都能成功。
9、关于webrtctest.lib为自定义库的生成:
9.1、从webrtc的out/release/obj/目录下
copy ..\release\obj\test\field_trial\field_trial.obj .
copy ..\release\obj\rtc_base\rtc_json\json.obj .
copy ..\release\obj\third_party\jsoncpp\jsoncpp\* .
copy ..\release\obj\test\platform_video_capturer\* .
copy ..\release\obj\test\video_test_common\* .
9.2、Master版本需要增加abseil-cpp\absl中的absl库
copy ..\release\obj\third_party\abseil-cpp\absl\flags\parse\* .
copy ..\release\obj\third_party\abseil-cpp\absl\flags\commandlineflag\* .
copy ..\release\obj\third_party\abseil-cpp\absl\flags\commandlineflag_internal\commandlineflag.obj commandlineflag_internal.obj
copy ..\release\obj\third_party\abseil-cpp\absl\flags\reflection\* .
copy ..\release\obj\third_party\abseil-cpp\absl\flags\marshalling\* .
copy ..\release\obj\third_party\abseil-cpp\absl\flags\flag_internal\flag.obj flag_internal.obj
copy ..\release\obj\third_party\abseil-cpp\absl\flags\flag\* .
copy ..\release\obj\third_party\abseil-cpp\absl\flags\private_handle_accessor\* .
copy ..\release\obj\third_party\abseil-cpp\absl\flags\usage\* .
copy ..\release\obj\third_party\abseil-cpp\absl\flags\usage_internal\usage.obj usage_internal.obj
copy ..\release\obj\third_party\abseil-cpp\absl\flags\config\* .
copy ..\release\obj\third_party\abseil-cpp\absl\flags\program_name\* .
9.3、vs2019环境下生成webTest.lib
1)五个目录中的全部obj 拷贝到一个新的目录下,在新的目录下打开cmd(最好是从vs2019的命令行打开)
2)执行 lib.exe *.obj /out:webrtcTest.lib,生成后拷贝到工程目录下就行。
3) lib.exe在vs2019的工具包中,所以要用vs2019的命令行,否则可能找不到它。
10、如果需要用rtc_use_h264,因需要用到ffmpeg,所以要用clang来编译,那需要增加以下参数:
rtc_use_h264=true clang_use_chrome_plugins =false is_chrome_branded=true use_custom_libcxx_for_host=false use_custom_libcxx=false
其中 use_custom_libcxx_for_host=false use_custom_libcxx=false 这两个参数使我花了很多时间,真坑爹啊。总以为是clang版本的问题。
gn gen out/Release "--args=is_debug=false rtc_use_h264=true clang_use_chrome_plugins =false is_chrome_branded=true use_custom_libcxx_for_host=false use_custom_libcxx=false " --ide=vs2019
用的是clang12版本(webrtc自带),最后确定与clang版本无关。