Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 编译gsoap输出文件(onvif)时出现问题_C++_Visual Studio 2019_Gsoap - Fatal编程技术网

C++ 编译gsoap输出文件(onvif)时出现问题

C++ 编译gsoap输出文件(onvif)时出现问题,c++,visual-studio-2019,gsoap,C++,Visual Studio 2019,Gsoap,由于某种原因,我在编译gsoap生成的代码时遇到了大量错误。我对使用gsoap还很陌生,我无法解决这个问题。我一直在遵循教程: 注意:对于wsdl2h.bat,wsdl文件在本地使用,因为gsoap的gpl版本不支持https,所以使用https链接不起作用。指向onvif.com的http链接重定向到链接的https版本 wsdl2h.bat wsdl2h.exe -O4 -P -x -o onvif.h ^ onvif\ver10\actionengine.wsdl ^ onvif\ver1

由于某种原因,我在编译gsoap生成的代码时遇到了大量错误。我对使用gsoap还很陌生,我无法解决这个问题。我一直在遵循教程:

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

wsdl2h.bat

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
这两行被添加到生成的onvif.h中。本教程希望您将wsdd10.h更改为wsdd5.h,但我的onvif.h中没有wsdd10.h可更改

#import "wsse.h"
#import "wsdd5.h"
soapcpp2.bat

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库复制到源目录的文件

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生成的源目录的文件

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
在main.cpp为int main{return 0;}的情况下尝试编译时遇到的stl错误

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    
更新:问题可能是编译不需要的wsddC.cpp。以下内容适用于示例中提到的一组ONVIF wsdl:

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-Debug,并且使用WSDL2H,使用选项-QNAMESPACE来使用C++命名空间,那么不要将导入行添加到OnvIF.H中,而是删除它们。相反,创建一个新文件,比如ws.h,其中包含两个导入行

#import "wsdd5.h"
#import "wsse.h"
分别使用以下代码为插件生成WS-*源代码:

soapcpp2 -a -x -L -pwsdd -I ~/gsoap-2.8/gsoap/import ws.h
并使用以下内容编译生成的源:

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文件:

现在,您有了要与ONVIF应用程序结合的对象文件。假设onvif.h是使用wsdl2h生成的,则执行soapcpp2以生成onvif代码。例如,客户端带有选项-C客户端,-j C++代理类,并强制SOAP 1.2与-2:

要一起编译,请注意使用以前编译的.o文件:


重要的部分是使用-DSOAP_H_FILE=wsddH.H来编译wsddC.cpp、wsddClient.cpp、wsseapi.c和wsddapi.c文件,因为这些插件需要WS-Security和WS-Discovery可序列化的类型和API。也许这种方法有点笨拙,但在生成C++代理类时需要用到。好的一面也允许代理类放置在C++命名空间中。

这里第一个明显的问题是将内容复制到源目录中。虽然指定错误的原因不是必需的,但这肯定是一种不良做法。所谓“将内容复制到源目录”,我指的是空visual studio解决方案的源目录。为什么这是一种不良行为?这似乎是我应该做的,因为我这样做,因为像SOAPGETGETYSTRON这样的函数在SOAPCCPP SOAPCP2 ONVIF.WANDSCDCCPP SOAPCP2 W.HYES中都定义,代码假定使用C++命名空间,并且忘记提及。名称空间由wsdl2h生成,选项为-qNAMESPACE。我已经更新了答案。顺便说一下,MSVC++不应该看到并使用onvif.h作为头文件。第二,主程序不应为空。使用-q选项时,您可以从下载示例main.cpp,但存在其他问题:全局作用域没有SOAP\u ENV\u标头、SOAP\u ENV\u错误、SOAP\u序列化\u指针找不到SOAP\u ENV\u标头标识符
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
soapcpp2 -2 -C -I ~/gsoap-2.8/gsoap/import -j -x onvif.h
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