gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 04:11:26 34 4
gpt4 key购买 nike

由于某些原因,我在尝试编译由 gsoap 生成的代码时遇到了很多错误。我对使用 gsoap 很陌生,我无法弄清楚问题所在。我一直在关注这里的教程:

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

注意:对于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

当尝试使用 int main(){ return 0; 编译 main.cpp 时出现 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(示例中提到的 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-Discovery,并使用带有选项 -qNAMESPACE 的 wsdl2h 来使用 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 文件:

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 强制 SOAP 1.2 :

soapcpp2 -2 -C -I ~/gsoap-2.8/gsoap/import -j -x onvif.h

一起编译(注意使用之前编译的.o文件):

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.cpp, wsddClient.cpp, wsseapi.cwsddapi.c 文件,因为这些插件需要 WS-Security 和 WS-Discovery 可序列化类型和 API。也许这种方法有点笨拙,但在生成 C++ 代理类时需要。从好的方面来说,还允许将代理类放置在 C++ 命名空间中。

关于c++ - 编译 gsoap 输出文件时出现问题 (onvif),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57708375/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com