5

我正在使用 linux 上的 gSOAP 编写一个 C++ Web 服务客户端,在同一个应用程序中使用 2 个单独的 wsdl 文件。我已经设法只使用一个 wsdl 文件,并且在阅读文档后,完成了在两个文件上使用 wsdl2h 的过程:

    wsdl2h -o header.h wsdlfile1.wsdl wsdlfile2.wsdl

这工作得很好,所以我做了

    soapcpp2 -i -I/usr/share/gsoap/import/ header.h

然后,我按照说明在 typemap.dat 中进行了所有常用的命名空间修改。我现在发现我有两个类型为soapService1Proxy.cpp/h 和soapService2Proxy.cpp/h 的.cpp 和.h 文件。这不是我所期望的,但无论如何,我在我的主函数中包含了两个头文件并创建了每个代理类的实例,并且使用方式与我对一个 wsdl 文件所做的完全相同。然后我编译

    g++ -DWITH_OPENSSL main.cpp soapC.cpp soapService1Proxy.cpp soapService2Proxy.cpp -lgsoapssl++ -lssl

返回错误

    /tmp/ccHNDAM4.o:(.data+0x0): multiple definition of `namespaces'
    /tmp/ccLJIHwV.o:(.data+0x0): first defined here
    collect2: ld returned 1 exit status

我知道“命名空间”指的是 .nsmap 文件中的数组(在这种情况下,每个 wsdl 都是相同的)。我只包含了其中一个,因为如果我同时包含两者,编译器会抱怨多重定义。如果有人能告诉我我在这里做错了什么,我真的很感激,因为我试图尽可能忠实地遵循指南和 gSOAP 文档,但根本无法解决这个问题。

4

1 回答 1

3

我从未使用过 SOAP,但我快速浏览了这个用户指南

7.1.4 节的最后一段说-n-p选项soapcpp2有助于解决链接冲突。第 19.35 节的链接提供了更多信息。看来您必须使用为每个文件提供 C++ 命名空间wsdl2h的选项单独在每个文件上运行。-q然后当您运行soapcpp2它时,它将自动应用-p,您所要做的就是-nnamespaces数组以您的 C++ 命名空间名称为前缀,后跟一个下划线。

我没有尝试过任何这些,但希望这足以让你再次前进。

于 2012-04-19T22:53:41.960 回答