1.下载gsoap_2.8.109.zip
2.解压gsoap_2.8.109.zip
3.进入gsoap2.8/gsoap/bin/win64目录
a.拷贝gsoap/wsdl/目录下的typemap.dat文件到当前目录
b.创建脚本auto_code_h_c++11.bat
@ECHO OFF
CD /D "%~dp0"
mkdir output
wsdl2h.exe -o output\onvif.h -c++11 -s -t .\typemap.dat http://www.onvif.org/onvif/ver10/device/wsdl/devicemgmt.wsdl http://www.onvif.org/onvif/ver10/event/wsdl/event.wsdl http://www.onvif.org/onvif/ver10/display.wsdl http://www.onvif.org/onvif/ver10/deviceio.wsdl http://www.onvif.org/onvif/ver20/imaging/wsdl/imaging.wsdl http://www.onvif.org/onvif/ver10/media/wsdl/media.wsdl http://www.onvif.org/onvif/ver20/ptz/wsdl/ptz.wsdl http://www.onvif.org/onvif/ver10/receiver.wsdl http://www.onvif.org/onvif/ver10/recording.wsdl http://www.onvif.org/onvif/ver10/search.wsdl http://www.onvif.org/onvif/ver10/network/wsdl/remotediscovery.wsdl http://www.onvif.org/onvif/ver10/replay.wsdl http://www.onvif.org/onvif/ver20/analytics/wsdl/analytics.wsdl http://www.onvif.org/onvif/ver10/analyticsdevice.wsdl http://www.onvif.org/onvif/ver10/schema/onvif.xsd http://www.onvif.org/ver10/actionengine.wsdl
@ECHO &PAUSE
c.创建脚本auto_code_cpp_c++11.bat
@ECHO OFF
CD /D "%~dp0"
mkdir output
soapcpp2.exe -2 -c++11 -j -x output\onvif.h -I%CD%/../../../../gsoap-2.8/gsoap;%CD%/../../../../gsoap-2.8/gsoap/import; -d output
@ECHO &PAUSE
d.创建脚本auto_code_client_c++11.bat
@ECHO OFF
CD /D "%~dp0"
mkdir output
soapcpp2 -a -x -L -pwsdd -d output -I%CD%/../../../../gsoap-2.8/gsoap/import; %CD%/../../../../gsoap-2.8/gsoap/import/wsdd5.h
@ECHO &PAUSE
4.运行脚本auto_code_h_c++11.bat
在output目录生成onvif.h文件
在onvif.h中添加#import "wsse.h"(鉴权使用)
5.运行脚本auto_code_cpp_c++11.bat
在output目录生成许多文件:

6.运行脚本auto_code_client_c++11.bat
在output目录生成许多文件:

7.使用方法:
新建gsoap-lib目录,三个子目录plugin、custom、stub
拷贝6步骤output目录下所有文件到stub目录。
拷贝
dom.cpp
stdsoap2.h stdsoap2.cpp
到gsoap-lib目录。
拷贝
chrono_duration.cpp chrono_time_point.cpp duration.c struct_timeval.c
chrono_duration.h chrono_time_point.h duration.h struct_timeval.h
到gsoap-lib目录(将后缀.c全部修改为.cpp)。
拷贝
mecevp.c smdevp.c threads.c wsaapi.c wsseapi.c wsse2api.c
mecevp.h smdevp.h threads.h wsaapi.h wsseapi.h wsse2api.c
到gsoap-lib目录(将后缀.c全部修改为.cpp)。
8.编译
编译时添加标志:
-DWITH_NONAMESPACES
-DWITH_OPENSSL
-DWITH_DOM
9.头文件引入
#include <stdsoap2.h>
#include <wsaapi.h>
#include <wsddStub.h>
#include <wsseapi.h>
#include <wsdd.nsmap>
#include <soapStub.h>
#include <httpda.h>
#include <soapPTZBindingProxy.h>
#include <soapDeviceBindingProxy.h>
#include <soapMediaBindingProxy.h>
FAQ常见问题及解决
问题1及解决:
wsa5.h(288): **ERROR**: service operation name clash: struct/class 'SOAP_ENV__Fault' already declared at wsa.h:273
则修改wsa5.h中的SOAP_ENV__Fault 为 SOAP_ENV__Fault_WSA5即可。
问题2及解决:
error LNK2001: unresolved external symbol namespaces
则引入头文件#include <wsdd.nsmap>(根据你实际的项目nsmap文件修改即可)
问题3及解决:
返回400/401,Bad Request/Unauthorized
鉴权方式问题,请参阅另一篇文章《onvif 鉴权最佳实践》