场景

        Windows版本gsoap生成C头文件,当前目录为E:/gsoap-2.8/build会出现如下的错误提示:

wsdl2h -o onvif.h -c -s -t ./typemap.dat http://www.onvif.org/onvif/ver10/device/wsdl/devicemgmt.wsdl http://www.onvif.org/onvif/ver10/media/wsdl/media.wsdl http://www.onvif.org/onvif/ver10/deviceio.wsdl http://www.onvif.org/onvif/ver10/network/wsdl/remotediscovery.wsdl

提示信息如下 

Connecting to 'http://www.onvif.org/onvif/ver10/device/wsdl/devicemgmt.wsdl' to retrieve WSDL/WADL or XSD... connected, receiving...
Redirected to 'https://www.onvif.org/onvif/ver10/device/wsdl/devicemgmt.wsdl'...

Cannot connect to https site: SSL/TLS support not enabled in this version. Visit https://www.genivia.com/downloads.html to download the secure version of wsdl2h.exe that supports SSL/TLS to connect to https sites.


解决方案一:

1)下载如下的文件,并且保存为相应的名称,可以采用curl下载保存,例如

curl https://www.onvif.org/onvif/ver10/device/wsdl/devicemgmt.wsdl -o  devicemgmt.wsdl

https://www.onvif.org/onvif/ver10/device/wsdl/devicemgmt.wsdl 

https://www.onvif.org/onvif/ver10/media/wsdl/media.wsdl 

https://www.onvif.org/onvif/ver10/deviceio.wsdl 

https://www.onvif.org/onvif/ver10/network/wsdl/remotediscovery.wsdl

https://www.onvif.org/ver10/schema/onvif.xsd 

https://www.onvif.org/ver10/schema/common.xsd

 2)在生成代码的目录的上一层E:/gsoap-2.8,需要创建ver10/device/wsdl/
存放上述下载的文件common.xsd  deviceio.wsdl  devicemgmt.wsdl  media.wsdl  onvif.xsd  remotediscovery.wsdl

3)生成代码指令如下:

wsdl2h -o onvif.h -c -s -t ./typemap.dat devicemgmt.wsdl media.wsdl deviceio.wsdl remotediscovery.wsdl




解决方案二:

1)进入E:\gsoap-2.8\gsoap\VisualStudio2005\wsdl2h工程,对工程添加OpenSSL的编译链接

添加头文件:C:\OpenSSL-Win32-1.0.1\include  E:\gsoap-2.8\gsoap\plugin E:\gsoap-2.8\gsoap\VisualStudio2005\wsdl2h\wsdl2h(后面两个是添加OpenSSL库,需要添加其他的库文件)

添加库文件:libeay32.lib ssleay32.lib

工程添加源码文件:httpda.c smdevp.c threads.c

预处理器添加宏定义:WITH_OPENSSL

准备知识

在Onvif官网页面中下载提供的功能相应的wsdl文件,如analytics.wsdl;devicemgmt.wsdl等。地址: https://www.onvif.org/profiles/specifications/,选择“Network Interface Specifications” 选择需要的文件另存为

虽然可以全部下载为wsdl文件,但是wsdl文件中存在相互依赖的关系,并且是带有存储的依赖,所以即使下载下来,生成的时候也要保持联网。虽然可以直接用url生成,但是会提示找不到某些文件,是因为wsdl里面有些用的居然是相对路径,所以碰到这种情况就必须下下来修改依赖的路径,或者把依赖的文件下载下来放到相应的本地路径。


wsdl2h常用选项

-o 文件名,指定输出头文件

-n 名空间前缀 代替默认的ns

-c 产生纯C代码,否则是C++代码

-s 不要使用STL代码

-t 文件名,指定type map文件,默认为typemap.dat

-e 禁止为enum成员加上名空间前缀


gsoap代码生成的细节

1)wsdl2h根据wsdl和xsd等资源文件生成*.h头文件(此文件是一个中间文件,但并不使用于代码编译中)

2)typemap.dat来自E:\gsoap-2.8\gsoap目录下,如果在生成Onvif.h头文件中没有指定这个配置文件,生成错误异常如下:

Critical error: #inport: Cannot open file "ns1.h" for reading.