首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >编译gsoap输出文件的问题(onvif)

编译gsoap输出文件的问题(onvif)
EN

Stack Overflow用户
提问于 2019-08-29 10:39:09
回答 1查看 918关注 0票数 0

由于某些原因,当我试图编译由gsoap生成的代码时,会出现大量错误。我对使用gsoap很陌生,我也找不出这个问题。我一直在学习本教程:

https://www.genivia.com/examples/onvif/index.html

注意:对于wsdl2h.bat,wsdl文件是在本地使用的,因为gpl版本的gsoap不支持https,所以使用https链接不起作用。指向onvif.com的http链接重定向到链接的https版本。

wsdl2h.bat

代码语言:javascript
运行
复制
wsdl2h.exe -O4 -P -x -o onvif.h ^
onvif\ver10\actionengine.wsdl ^
onvif\ver10\deviceio.wsdl ^
onvif\ver10\display.wsdl ^
onvif\ver10\receiver.wsdl ^
onvif\ver10\recording.wsdl ^
onvif\ver10\replay.wsdl ^
onvif\ver10\search.wsdl ^
onvif\ver10\advancedsecurity\wsdl\advancedsecurity.wsdl ^
onvif\ver10\authenticationbehavior\wsdl\authenticationbehavior.wsdl ^
onvif\ver10\credential\wsdl\credential.wsdl ^
onvif\ver10\device\wsdl\devicemgmt.wsdl ^
onvif\ver10\events\wsdl\event.wsdl ^
onvif\ver10\media\wsdl\media.wsdl ^
onvif\ver10\provisioning\wsdl\provisioning.wsdl ^
onvif\ver10\pacs\accesscontrol.wsdl ^
onvif\ver10\pacs\accessrules.wsdl ^
onvif\ver10\pacs\doorcontrol.wsdl ^
onvif\ver10\schedule\wsdl\schedule.wsdl ^
onvif\ver10\thermal\wsdl\thermal.wsdl ^
onvif\ver10\uplink\wsdl\uplink.wsdl ^
onvif\ver20\analytics\wsdl\analytics.wsdl ^
onvif\ver20\imaging\wsdl\imaging.wsdl ^
onvif\ver20\ptz\wsdl\ptz.wsdl ^
onvif\ver20\media\wsdl\media.wsdl

这2行被添加到生成的onvif.h中。本教程希望您将wsdd10.h更改为wsdd5.h,但我的onvif.h中没有wsdd10.h可更改。

代码语言:javascript
运行
复制
#import "wsse.h"
#import "wsdd5.h"

soapcpp2.bat

代码语言:javascript
运行
复制
soapcpp2 -2 -j -x -C -I gsoap\gsoap_2.8.91\gsoap-2.8\gsoap\import;gsoap\gsoap_2.8.91\gsoap-2.8\gsoap onvif.h
soapcpp2 -a -x -L -pwsdd -I gsoap\gsoap_2.8.91\gsoap-2.8\gsoap\import gsoap\gsoap_2.8.91\gsoap-2.8\gsoap\import\wsdd5.h

从gsoap库复制到源目录的文件

代码语言:javascript
运行
复制
dom.cpp
mecevp.c, .h
smdevp.c, .h
stdsoap2.cpp, h
threads.c, h
wsaapi.c, h
wsddapi.c, h
wsseapi.cpp, h

复制到源目录的文件(由soapcpp2.exe生成)

代码语言:javascript
运行
复制
AccessRulesBinding.nsmap
ActionEngineBinding.nsmap
AdvancedSecurityServiceBinding.nsmap
AuthenticationBehaviorBinding.nsmap
CredentialBinding.nsmap
DeviceBinding.nsmap
DeviceIOBinding.nsmap
DisplayBinding.nsmap
DoorControlBinding.nsmap
ImagingBinding.nsmap
Media2Binding.nsmap
MediaBinding.nsmap
PACSBinding.nsmap
ProvisioningBinding.nsmap
PTZBinding.nsmap
PullPointSubscriptionBinding.nsmap
ReceiverBinding.nsmap
RecordingBinding.nsmap
ReplayBinding.nsmap
RuleEngineBinding.nsmap
ScheduleBinding.nsmap
SearchBinding.nsmap
soapAccessRulesBindingProxy.cpp
soapAccessRulesBindingProxy.h
soapActionEngineBindingProxy.cpp
soapActionEngineBindingProxy.h
soapAdvancedSecurityServiceBindingProxy.cpp
soapAdvancedSecurityServiceBindingProxy.h
soapAuthenticationBehaviorBindingProxy.cpp
soapAuthenticationBehaviorBindingProxy.h
soapC.cpp
soapCredentialBindingProxy.cpp
soapCredentialBindingProxy.h
soapDeviceBindingProxy.cpp
soapDeviceBindingProxy.h
soapDeviceIOBindingProxy.cpp
soapDeviceIOBindingProxy.h
soapDisplayBindingProxy.cpp
soapDisplayBindingProxy.h
soapDoorControlBindingProxy.cpp
soapDoorControlBindingProxy.h
soapH.h
soapImagingBindingProxy.cpp
soapImagingBindingProxy.h
soapMedia2BindingProxy.cpp
soapMedia2BindingProxy.h
soapMediaBindingProxy.cpp
soapMediaBindingProxy.h
soapPACSBindingProxy.cpp
soapPACSBindingProxy.h
soapProvisioningBindingProxy.cpp
soapProvisioningBindingProxy.h
soapPTZBindingProxy.cpp
soapPTZBindingProxy.h
soapPullPointSubscriptionBindingProxy.cpp
soapPullPointSubscriptionBindingProxy.h
soapReceiverBindingProxy.cpp
soapReceiverBindingProxy.h
soapRecordingBindingProxy.cpp
soapRecordingBindingProxy.h
soapReplayBindingProxy.cpp
soapReplayBindingProxy.h
soapRuleEngineBindingProxy.cpp
soapRuleEngineBindingProxy.h
soapScheduleBindingProxy.cpp
soapScheduleBindingProxy.h
soapSearchBindingProxy.cpp
soapSearchBindingProxy.h
soapStub.h
soapThermalBindingProxy.cpp
soapThermalBindingProxy.h
soapUplinkBindingProxy.cpp
soapUplinkBindingProxy.h
soapwsddProxy.cpp
soapwsddProxy.h
ThermalBinding.nsmap
UplinkBinding.nsmap
wsdd.nsmap
wsddC.cpp
wsddClient.cpp
wsddH.h
wsddServer.cpp
wsddStub.h

当我试图用int (){ main.cpp 0;}编译时遇到的stl错误

代码语言:javascript
运行
复制
Severity    Code    Description Project File    Line    Suppression State
Error   C2059    syntax error: ';'  libOnvif    C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.22.27905\include\cstdint 18  
Error   C2061    syntax error: identifier 'std' libOnvif    C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.22.27905\include\cstdint 18  
Error   C2449    found '{' at file scope (missing function header?) libOnvif    C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.22.27905\include\cstdint 18  
Error   C2059    syntax error: '}'  libOnvif    C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.22.27905\include\cstdint 86  
Error   C2061    syntax error: identifier 'noexcept'    libOnvif    C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.22.27905\include\cstdlib 19  
Error   C2059    syntax error: ';'  libOnvif    C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.22.27905\include\cstdlib 19  
Error   C2449    found '{' at file scope (missing function header?) libOnvif    C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.22.27905\include\cstdlib 19  
Error   C2059    syntax error: '}'  libOnvif    C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.22.27905\include\cstdlib 21  
Error   C2061    syntax error: identifier 'noexcept'    libOnvif    C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.22.27905\include\cstdlib 27  
Error   C2059    syntax error: ';'  libOnvif    C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.22.27905\include\cstdlib 27  
Error   C2449    found '{' at file scope (missing function header?) libOnvif    C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.22.27905\include\cstdlib 27  
Error   C2059    syntax error: '}'  libOnvif    C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.22.27905\include\cstdlib 29  
Error   C2061    syntax error: identifier 'std' libOnvif    C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.22.27905\include\cstdio  29  
Error   C2059    syntax error: ';'  libOnvif    C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.22.27905\include\cstdio  29  
Error   C2449    found '{' at file scope (missing function header?) libOnvif    C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.22.27905\include\cstdio  29  
Error   C2059    syntax error: '}'  libOnvif    C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.22.27905\include\cstdio  87  
Error   C4233    nonstandard extension used: '__is_union' keyword only supported in C++, not C  libOnvif    C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.22.27905\include\type_traits 482 
Error   C4233    nonstandard extension used: '__is_union' keyword only supported in C++, not C  libOnvif    C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.22.27905\include\type_traits 485 
 C:\Users\...\lib\libOnvif\wsddapi.c    1703    
EN

回答 1

Stack Overflow用户

发布于 2019-08-30 15:07:40

更新:问题可能是编译不需要的wsddC.cpp。以下内容适用于一组ONVIF WSDL(示例中提到的WSDL):

代码语言:javascript
运行
复制
c++ -o ipcamera -Wall -DWITH_OPENSSL -DWITH_DOM -DWITH_ZLIB \
  -I. -I ~/gsoap-2.8/gsoap -I ~/gsoap-2.8/gsoap/plugin -I ~/gsoap-2.8/gsoap/custom \
  main.cpp \
  soapC.cpp \
  wsddClient.cpp \
  wsddServer.cpp \
  soapAdvancedSecurityServiceBindingProxy.cpp \
  soapDeviceBindingProxy.cpp \
  soapDeviceIOBindingProxy.cpp \
  soapImagingBindingProxy.cpp \
  soapMediaBindingProxy.cpp \
  soapPTZBindingProxy.cpp \
  soapPullPointSubscriptionBindingProxy.cpp \
  soapRemoteDiscoveryBindingProxy.cpp \
  ~/gsoap-2.8/gsoap/stdsoap2.cpp \
  ~/gsoap-2.8/gsoap/dom.cpp \
  ~/gsoap-2.8/gsoap/plugin/smdevp.c \
  ~/gsoap-2.8/gsoap/plugin/mecevp.c \
  ~/gsoap-2.8/gsoap/plugin/wsaapi.c \
  ~/gsoap-2.8/gsoap/plugin/wsseapi.c \
  ~/gsoap-2.8/gsoap/plugin/wsddapi.c \
  -lcrypto -lssl -lz

但是,如果您同时使用WS-Security和WS-发现,并使用wsdl2h with -qNAMESPACE选项使用C++名称空间,则不要将导入行添加到onvif.h,而是删除它们。相反,使用两个导入行创建一个新文件,比如ws.h

代码语言:javascript
运行
复制
#import "wsdd5.h"
#import "wsse.h"

分别使用以下代码为插件生成WS-*源代码:

代码语言:javascript
运行
复制
soapcpp2 -a -x -L -pwsdd -I ~/gsoap-2.8/gsoap/import ws.h

并使用以下方法编译生成的源:

代码语言:javascript
运行
复制
c++ -c -DSOAP_H_FILE=wsddH.h -Wall -DWITH_OPENSSL -DWITH_DOM -DWITH_ZLIB \
  -I. -I ~/gsoap-2.8/gsoap -I ~/gsoap-2.8/gsoap/plugin -I ~/gsoap-2.8/gsoap/custom \
  wsddC.cpp

c++ -c -DSOAP_H_FILE=wsddH.h -Wall -DWITH_OPENSSL -DWITH_DOM -DWITH_ZLIB \
  -I. -I ~/gsoap-2.8/gsoap -I ~/gsoap-2.8/gsoap/plugin -I ~/gsoap-2.8/gsoap/custom \
  wsddClient.cpp

您还应该以这种方式编译插件,这些插件依赖于生成的wsddH.h和间接生成的wsddStub.h文件:

代码语言:javascript
运行
复制
c++ -c -DSOAP_H_FILE=wsddH.h -Wall -DWITH_OPENSSL -DWITH_DOM -DWITH_ZLIB \
  -I. -I ~/gsoap-2.8/gsoap -I ~/gsoap-2.8/gsoap/plugin -I ~/gsoap-2.8/gsoap/custom \
  plugin/wsaapi.c

c++ -c -DSOAP_H_FILE=wsddH.h -Wall -DWITH_OPENSSL -DWITH_DOM -DWITH_ZLIB \
  -I. -I ~/gsoap-2.8/gsoap -I ~/gsoap-2.8/gsoap/plugin -I ~/gsoap-2.8/gsoap/custom \
  plugin/wsddapi.c

c++ -c -DSOAP_H_FILE=wsddH.h -Wall -DWITH_OPENSSL -DWITH_DOM -DWITH_ZLIB \
  -I. -I ~/gsoap-2.8/gsoap -I ~/gsoap-2.8/gsoap/plugin -I ~/gsoap-2.8/gsoap/custom \
  plugin/wsseapi.c

现在,您可以将对象文件与ONVIF应用程序结合起来。假设onvif.h是用wsdl2h生成的,那么执行soapcpp2生成ONVIF代码。例如,具有选项-C (客户端)、-j (C++代理类)和使用-2强制SOAP1.2的客户端

代码语言:javascript
运行
复制
soapcpp2 -2 -C -I ~/gsoap-2.8/gsoap/import -j -x onvif.h

要将其全部编译在一起(请注意以前编译的.o文件的使用):

代码语言:javascript
运行
复制
c++ -o ipcamera -Wall -DWITH_OPENSSL -DWITH_DOM -DWITH_ZLIB \
  -I. -I ~/gsoap-2.8/gsoap -I ~/gsoap-2.8/gsoap/plugin -I ~/gsoap-2.8/gsoap/custom \
  main.cpp \
  soapAdvancedSecurityServiceBindingProxy.cpp \
  soapDeviceBindingProxy.cpp \
  soapDeviceIOBindingProxy.cpp \
  soapImagingBindingProxy.cpp \
  soapMediaBindingProxy.cpp \
  soapPTZBindingProxy.cpp \
  soapPullPointSubscriptionBindingProxy.cpp \
  soapRemoteDiscoveryBindingProxy.cpp \
  ~/gsoap-2.8/gsoap/stdsoap2.cpp \
  ~/gsoap-2.8/gsoap/dom.cpp \
  ~/gsoap-2.8/gsoap/plugin/smdevp.c \
  ~/gsoap-2.8/gsoap/plugin/mecevp.c \
  ~/gsoap-2.8/gsoap/soapC.cpp \
  ~/gsoap-2.8/gsoap/wsddC.o \
  ~/gsoap-2.8/gsoap/wsddClient.o \
  ~/gsoap-2.8/gsoap/plugin/wsaapi.o \
  ~/gsoap-2.8/gsoap/plugin/wsddapi.o \
  ~/gsoap-2.8/gsoap/plugin/wsseapi.o \
  -lcrypto -lssl -lz

重要的部分是使用-DSOAP_H_FILE=wsddH.h编译wsddC.cppwsddClient.cppwsseapi.cwsddapi.c文件,因为这些插件需要WS-Security和WS-发现可序列化的类型和API。也许这种方法有点杂乱无章,但是在生成C++代理类时是需要的。在优点方面,还允许将代理类放置在C++命名空间中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57708375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档