在VS2017上编译peerconnection client

目前编译通过,但是执行出现问题。为了节省读者宝贵时间,可以不用往下看。

编译了webRTC Windows源码之后,想使用编译出来的库写一个demo出来,但是又不知到怎么下手。

经高人指点,可以通过源码中带的示例peerconnection_client和peerconnection_server来学webRTC peerconnection API的使用方法。

1、 环境:win10+VS2017+webRTC的debug32位库

2、新建一个Windows控制台的应用程序

3、把peerconnection client的*.cc 和 *.h文件考出来,那个Linux的文件夹,不需要。添加进这个工程。我把*.cc 直接换成了*.cpp

4、然后用一个脚本,从编译出来的webRTC/src/out/Release 文件夹中,把需要的 *.h  *.lib *.obj 等头文件和库文件提取出来,单独放在一个文件中。如下:

--------------------------------------------------------------------------------------------------------

5、将peerconnection client 例子中的包含文件的路径改一改,比如一些*.h文件,直接是这个项目的,而不是example...里面的。

6、然后在属性中,添加 附加包含目录, 就是刚才提取出来的 include文件夹。

7、然后在属性中,添加 库目录,就是刚才提取出来的,一定要注意,lib文件一定要包含到那一级,而不是像include似的,包含个头文件夹就行。

8 、然后在属性中,添加 库文件的lib名称。这里面有一些,是没有在packages\lib\Debug_32\obj\中的,需要从src的out中去查找。因为脚本丢失了一些,没有提取出来。

platform_video_capturer.obj
vcm_capturer.obj
fake_texture_frame.obj
frame_generator.obj
frame_generator_capturer.obj
frame_utils.obj
test_video_capturer.obj
json_reader.obj
json_value.obj
json_writer.obj
json.obj
field_trial.obj

9、然后在添加 预编译信息

9.1 、debug版本: 

错误:error LNK2019 无法解析的外部符号 _WinMain@16,该符号在函数 "int __cdecl invoke_main(void)"

修改:_WINDOWS删除,并添加_CONSOLE.   还要修改属性中:

总之,上面两处需要保持一致,我这里选择Windows,窗口,通过的。但是编译成功,又不能执行。

WIN32
_DEBUG
CLIENTSDK_EXPORTS
_WINDOWS
_USRDLL
NOMINMAX
WIN32_LEAN_AND_MEAN
WEBRTC_WIN
_HAS_ITERATOR_DEBUGGING=0
USE_AURA=1
NO_TCMALLOC
FULL_SAFE_BROWSING
SAFE_BROWSING_CSD
SAFE_BROWSING_DB_LOCAL
CHROMIUM_BUILD
__STD_C
_CRT_RAND_S
_CRT_SECURE_NO_DEPRECATE
_SCL_SECURE_NO_DEPRECATE
_ATL_NO_OPENGL
CERT_CHAIN_PARA_HAS_EXTRA_FIELDS
PSAPI_VERSION=2
_SECURE_ATL
_USING_V110_SDK71_
WINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP
_UNICODE
UNICODE
_WIN32_WINNT=0x0A00
WINVER=0x0A00
NVALGRIND
DYNAMIC_ANNOTATIONS_ENABLED=0
WEBRTC_ENABLE_PROTOBUF=0
WEBRTC_INCLUDE_INTERNAL_AUDIO_DEVICE
RTC_ENABLE_VP9
HAVE_SCTP
WEBRTC_USE_H264
WEBRTC_NON_STATIC_TRACE_EVENT_HANDLERS=0
ABSL_ALLOCATOR_NOTHROW=1
HAVE_WEBRTC_VIDEO

9.2 、 release版本

WIN32
NDEBUG
CLIENTSDK_EXPORTS
_WINDOWS
_USRDLL
NOMINMAX
WIN32_LEAN_AND_MEAN
_WEBSOCKETPP_CPP11_STL_
WEBRTC_WIN
USE_AURA=1
NO_TCMALLOC
FULL_SAFE_BROWSING
SAFE_BROWSING_CSD
SAFE_BROWSING_DB_LOCAL
CHROMIUM_BUILD
__STD_C
_CRT_RAND_S
_CRT_SECURE_NO_DEPRECATE
_SCL_SECURE_NO_DEPRECATE
_ATL_NO_OPENGL
CERT_CHAIN_PARA_HAS_EXTRA_FIELDS
PSAPI_VERSION=2
_SECURE_ATL
_USING_V110_SDK71_
WINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP
_UNICODE
UNICODE
_WIN32_WINNT=0x0A00
WINVER=0x0A00
NVALGRIND
DYNAMIC_ANNOTATIONS_ENABLED=0
WEBRTC_ENABLE_PROTOBUF=0
WEBRTC_INCLUDE_INTERNAL_AUDIO_DEVICE
RTC_ENABLE_VP9
HAVE_SCTP
WEBRTC_USE_H264
WEBRTC_NON_STATIC_TRACE_EVENT_HANDLERS=0
ABSL_ALLOCATOR_NOTHROW=1
HAVE_WEBRTC_VIDEO

10 、在项目中,main文件中,需要添加这些内容:webrtc.lib的路径,根据自己的情况进行修改

#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib,"Winmm.lib")
#pragma comment(lib,"Strmiids.lib")
#pragma comment(lib,"Msdmo.lib")
#pragma comment(lib,"Dmoguids.lib")
#pragma comment(lib,"Secur32.lib")
#pragma comment(lib,"wmcodecdspuuid.lib")

#pragma comment(lib,"obj/webrtc.lib")

11 、根据编译的错误提示,需要修改一下这里。

会遇到的问题:

编译项目,会发现有一些.h  .lib  .obj文件,并没有包含进来,所以需要去src/out/Release 里面去找找,然后把这些文件再添加进刚才提取出的文件夹中。比如下面这些,就需要有一个notepad++的工具,搜索文件中的内容,根据函数名,定位到文件,然后添加进来。

1>------ 已启动生成: 项目: client, 配置: Debug Win32 ------
1>conductor.obj : error LNK2019: 无法解析的外部符号 "bool __cdecl rtc::GetIntFromJsonObject(class Json::Value const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,int *)" (?GetIntFromJsonObject@rtc@@YA_NABVValue@Json@@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@PAH@Z),该符号在函数 "protected: virtual void __thiscall Conductor::OnMessageFromPeer(int,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?OnMessageFromPeer@Conductor@@MAEXHABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) 中被引用
1>conductor.obj : error LNK2019: 无法解析的外部符号 "bool __cdecl rtc::GetStringFromJsonObject(class Json::Value const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > *)" (?GetStringFromJsonObject@rtc@@YA_NABVValue@Json@@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@PAV45@@Z),该符号在函数 "protected: virtual void __thiscall Conductor::OnMessageFromPeer(int,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?OnMessageFromPeer@Conductor@@MAEXHABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) 中被引用
1>main.obj : error LNK2019: 无法解析的外部符号 "void __cdecl webrtc::test::ValidateFieldTrialsStringOrDie(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?ValidateFieldTrialsStringOrDie@test@webrtc@@YAXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z),该符号在函数 _wWinMain@16 中被引用
1>libcmtd.lib(exe_main.obj) : error LNK2019: 无法解析的外部符号 _main,该符号在函数 "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ) 中被引用
1>E:\webRTC_test\peerConnectionDemo\client\client\Debug\client.exe : fatal error LNK1120: 4 个无法解析的外部命令
1>已完成生成项目“client.vcxproj”的操作 - 失败。
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

12、虽然编译通过,但是执行的时候,遇到这个错误:无法启动程序,不支持操作,位置错误:0x800700d8

网上给的答案是:库和编译器的位选择不一致。但我这里32位debug的webRTC, 也编译的32位的debug,怎么就不一致了呢。奇怪。

参考链接:https://www.cnblogs.com/CoderTian/p/7828926.html

参考链接:https://blog.csdn.net/luoyayun361/article/details/84403579

发布了426 篇原创文章 · 获赞 167 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/qq_34732729/article/details/105737685