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

一、使用gSOAP工具,根据onvif的wsdl生成onvif代码框架
1、根据onvif官网提供的remotediscovery.wsdl产生onvif.h头文件
wsdl2h -o onvif.h -c -s -t ./typemap.dat
http://www.onvif.org/onvif/ver10/network/wsdl/remotediscovery.wsdl

2、使用onvif.h来产生骨架代码
soapcpp2 -c onvif.h -x -I ../../gsoap/import -I ../../gsoap/

第二步执行时,会产生如下错误:
Critical error: #inport: Cannot open file "ns1.h" for reading.

错误原因是onvif.h里有如下代码
#import "ns1.h" // ns1 = <http://www.w3.org/2005/08/addressing>

如果通过下面方式避免这个问题:
根据wsdl生成头文件时,加1个xsd文件
wsdl2h -o onvif.h -c -s -t ./typemap.dat
http://www.onvif.org/onvif/ver10/network/wsdl/remotediscovery.wsdl
http://www.w3.org/2006/03/addressing/ws-addr.xsd

会导致生成的文件在工程中编译不过去。

soap_default_SOAP_ENV__Header重复等错误。

所以此问题的根本原因是typemap.dat使用的不正确。

gsoap_2.8.18中gsoap-2.8\gsoap\typemap.dat,ONVIF的那些配置都已经加进去了。

直接使用即可。不需要做任何修改。之前的版本,如果没有那些配置,要在现有typemap.dat的基础上增加。


二、ONVIF的typemap.dat修改来源
How do I use gSOAP for the ONVIF specifications?


三、typemap.dat里增加下面内容,可避免出现ns1、ns2、ns3等无意义的命名规则
# W3 recommended prefixes
w3xop = " http://www.w3.org/2004/08/xop/include"


四、修改下面错误
wsa5.h(288): **ERROR**: remote method name clash: struct/class 'SOAP_ENV__Fault' already declared at line 274
打开文件gsoap_2.8.18/gsoap-2.8/gsoap/import/ wsa5.h
将277行int SOAP_ENV__Fault修改为int SOAP_ENV__Fault_Ex
笔者没有使用这种方法,是将这个结构体直接注释的方式,最后的结果是,都可以使用。

五、上一步生成的onvif.h文件中没有打开wsse.h, 导致最后生成代码中SOAP_ENV__Header 结构体中缺少定义 wsse__Security数据段,无法进行鉴权命令。
即:添加对openssl的支持,在上一步生成的onvif.h中添加(可选)




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值