在 gsoap 绑定中使用 Qt 自定义类型而不是 STL 类型的链接错误

Link errors using Qt custom types instead of STL types in gsoap binding

提问人:Emanuele Merlo 提问时间:3/4/2021 最后编辑:Emanuele Merlo 更新时间:3/5/2021 访问量:49

问:

我正在开发一个Qt C++程序,它必须将数据发送到Web服务。 我使用 gsoap (v2.8.111) 以这种方式生成数据绑定源代码:

wsdl2h -v -c++ -t ./typemap.dat -o binding/DonaldDuck.h ./DonaldDuck.wsdl 
wsdl2h -v -c++ -t ./typemap.dat -o binding/MickeyMouse.h ./MickeyMouse.wsdl 
wsdl2h -v -c++ -t ./typemap.dat -o binding/DaisyDuck.h ./DaisyDuck.wsdl 
wsdl2h -v -c++ -t ./typemap.dat -o binding/ScroogeMcDuck.h ./ScroogeMcDuck.wsdl 

soapcpp2 -C -c++ -j -qDonaldDuck -dbinding binding/DonaldDuck.h 
soapcpp2 -C -c++ -j -qMikeyMouse -dbinding binding/MickeyMouse.h 
soapcpp2 -C -c++ -j -qDaisyDuck -dbinding binding/DaisyDuck.h 
soapcpp2 -C -c++ -j -qScroogeMcDuck -dbinding binding/ScroogeMcDuck.h 

wsdl2h -c++ -g -t ./typemap.dat -o ./binding/Common.h *.wsdl
soapcpp2  -C -c++ -r -n -i -L -j -dbinding  ./binding/Common.h

如果我使用配置为使用 STL 类型的 typemap.dat,我可以成功构建和运行程序。 但是因为我是用Qt进行开发的,所以我想使用Qt类型(特别是QStringQDateTime),所以我更改了typemap.dat文件,如 https://www.genivia.com/doc/databinding/html/index.html 所述。 使用新的类型映射 .dat 使用上面列出的相同命令的生成是成功的,但在构建过程中,会意外地发出许多多个定义的信号。

我不明白为什么会出现这个问题,谁能帮我?

如果需要,我可以提供其他信息。

C++ Qt Web 服务 链接器错误 gsoap

评论

1赞 Dr. Alex RE 3/4/2021
该文档不建议多次运行 wsdl2h 和 soapcpp2。这显然会产生具有大量重叠的代码。这种重叠会导致链接错误。难道您不能将所有 WSDL 文件与对 wsdl2h 的一次调用一起转换吗?尝试将所有 WSDL 文件作为参数输入到 wsdl2h。然后只运行一次 soapcpp2。
0赞 Emanuele Merlo 3/5/2021
感谢您的评论。对所有 wsdls 进行一次调用实际上是我尝试的第一件事,但我不知道为什么它没有为各种端点创建方法。在阅读了文档、研究了命令行开关并阅读了我找到的所有帖子之后,唯一有效的解决方案就是我描述的解决方案。除其他外,在相同的生成序列下,如果我不自定义类型映射.dat并使用STL类型,则不存在链接问题。相反,当我自定义 typemap.dat 以使用 QT 类型时,它们就会发生。
0赞 Dr. Alex RE 3/6/2021
您可以尝试 wsdl2h 选项 -Nname 看看是否有帮助。通过将 WSDL 放在同一个命令行上,它假定 WSDL 对 WSDL 操作和模式使用不同的命名空间(最佳实践)。如果 WSDL 发生冲突(相同的目标命名空间),则可能存在问题,同样,尝试编译使用相同 C++ 命名空间的多个 C++ 项目也不会有好结果。

答: 暂无答案