GSOAP开发ONVIF客户端服务端遇wsdd函数未定义引用问题求助
解决gSOAP WSDD链接错误(ONVIF客户端/服务端开发)
背景
正在开发一款同时支持ONVIF客户端和服务端的应用,使用Ubuntu提供的gSOAP 2.8.124版本,基于WSDD规范开发。
当前开发步骤
1. 生成头文件
执行以下命令生成ONVIF媒体、设备管理和搜索服务的头文件:
wsdl2h -P -x -c++17 -O4 -g -f onvif-wsdl/wsdl/ver20/media/wsdl/media.wsdl onvif-wsdl/wsdl/ver10/device/wsdl/devicemgmt.wsdl onvif-wsdl/wsdl/ver10/search.wsdl -o temp.h echo '#import "from-gsoap/import/wsse.h"' > media.h echo '#import "from-gsoap/import/wsdd.h"' >> media.h cat temp.h >> media.h
2. 生成gSOAP代码
通过soapcpp2生成所需的序列化/反序列化及网络通信代码:
soapcpp2 -a -2 -j -c++17 -Ec -dgsoap/ -L -x media.h
3. CMake配置
当前CMake编译配置如下,已链接gsoapssl++库:
add_executable(onvif-test3-bc test3-bcast-listener.cpp from-gsoap/custom/struct_timeval.cpp from-gsoap/plugin/wsaapi.cpp from-gsoap/plugin/wsddapi.cpp gsoap/soapC.cpp )
遇到的链接错误
编译时出现一系列未定义引用错误,涉及WSDD相关函数:
/usr/bin/ld: CMakeFiles/onvif-test3-bc.dir/from-gsoap/plugin/wsddapi.cpp.o: in function `soap_wsdd_Hello': onvif/from-gsoap/plugin/wsddapi.cpp:582: undefined reference to `soap_send___wsdd__Hello(soap*, char const*, char const*, wsdd__HelloType*)' /usr/bin/ld: CMakeFiles/onvif-test3-bc.dir/from-gsoap/plugin/wsddapi.cpp.o: in function `soap_wsdd_Bye': onvif/from-gsoap/plugin/wsddapi.cpp:651: undefined reference to `soap_send___wsdd__Bye(soap*, char const*, char const*, wsdd__ByeType*)' /usr/bin/ld: CMakeFiles/onvif-test3-bc.dir/from-gsoap/plugin/wsddapi.cpp.o: in function `soap_wsdd_Probe': onvif/from-gsoap/plugin/wsddapi.cpp:713: undefined reference to `soap_send___wsdd__Probe(soap*, char const*, char const*, wsdd__ProbeType*)' /usr/bin/ld: onvif/from-gsoap/plugin/wsddapi.cpp:726: undefined reference to `soap_recv___wsdd__ProbeMatches(soap*, __wsdd__ProbeMatches*)' /usr/bin/ld: CMakeFiles/onvif-test3-bc.dir/from-gsoap/plugin/wsddapi.cpp.o: in function `soap_wsdd_Resolve': onvif/from-gsoap/plugin/wsddapi.cpp:806: undefined reference to `soap_send___wsdd__Resolve(soap*, char const*, char const*, wsdd__ResolveType*)' /usr/bin/ld: onvif/from-gsoap/plugin/wsddapi.cpp:819: undefined reference to `soap_recv___wsdd__ResolveMatches(soap*, __wsdd__ResolveMatches*)' /usr/bin/ld: CMakeFiles/onvif-test3-bc.dir/from-gsoap/plugin/wsddapi.cpp.o: in function `soap_wsdd_ProbeMatches': onvif/from-gsoap/plugin/wsddapi.cpp:971: undefined reference to `soap_send___wsdd__ProbeMatches(soap*, char const*, char const*, wsdd__ProbeMatchesType*)' /usr/bin/ld: CMakeFiles/onvif-test3-bc.dir/from-gsoap/plugin/wsddapi.cpp.o: in function `soap_wsdd_ResolveMatches': onvif/from-gsoap/plugin/wsddapi.cpp:1039: undefined reference to `soap_send___wsdd__ResolveMatches(soap*, char const*, char const*, wsdd__ResolveMatchesType*)' /usr/bin/ld: CMakeFiles/onvif-test3-bc.dir/from-gsoap/plugin/wsddapi.cpp.o: in function `__wsdd__Probe(soap*, wsdd__ProbeType*)': onvif/from-gsoap/plugin/wsddapi.cpp:1444: undefined reference to `wsdd_event_Probe(soap*, char const*, char const*, char const*, char const*, char const*, wsdd__ProbeMatchesType*)' /usr/bin/ld: onvif/from-gsoap/plugin/wsddapi.cpp:1479: undefined reference to `soap_send___wsdd__ProbeMatches(soap*, char const*, char const*, wsdd__ProbeMatchesType*)' /usr/bin/ld: CMakeFiles/onvif-test3-bc.dir/from-gsoap/plugin/wsddapi.cpp.o: in function `__wsdd__Resolve(soap*, wsdd__ResolveType*)': onvif/from-gsoap/plugin/wsddapi.cpp:1610: undefined reference to `soap_send___wsdd__ResolveMatches(soap*, char const*, char const*, wsdd__ResolveMatchesType*)'
问题分析
排查发现soap_send___wsdd__Hello等符号仅在gsoap/plugin/wsddapi.h中有声明,未找到实现代码。推测是编译时遗漏了soapcpp2生成的关键文件。
解决方案
1. 添加soapcpp2生成的客户端/服务端代码文件
执行soapcpp2后,会在gsoap/目录下生成客户端(soapClient.cpp)和服务端(soapServer.cpp)代码文件,这些文件包含了WSDD相关发送/接收函数的实现。需要将它们添加到CMake编译列表中:
add_executable(onvif-test3-bc test3-bcast-listener.cpp from-gsoap/custom/struct_timeval.cpp from-gsoap/plugin/wsaapi.cpp from-gsoap/plugin/wsddapi.cpp gsoap/soapC.cpp gsoap/soapClient.cpp # 客户端功能所需 gsoap/soapServer.cpp # 服务端功能所需 )
如果使用了-j参数(生成带命名空间的代理类),则对应添加soapMediaBindingProxy.cpp和soapMediaBindingService.cpp。
2. 确认WSDD插件编译完整性
确保wsddapi.cpp已正确编译,且链接阶段包含了gsoapssl++库。若使用预编译gSOAP库,需确认库版本与生成代码的版本一致(此处为2.8.124)。
3. 检查头文件导入与代码生成参数
确认media.h中已正确导入wsdd.h,且soapcpp2参数未屏蔽WSDD相关代码生成。若wsdl2h使用了自定义typemap.dat,需确保其中包含WSDD的类型映射规则。
内容的提问来源于stack exchange,提问作者Folkert van Heusden
相关产品推荐
相关产品推荐

