You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 04:37:01