将gSOAP与2个不同的wsdl文件一起使用时出现链接器错误

mat*_*975 5 c++ gsoap

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

    wsdl2h -o header.h wsdlfile1.wsdl wsdlfile2.wsdl
Run Code Online (Sandbox Code Playgroud)

这很好,所以我做了

    soapcpp2 -i -I/usr/share/gsoap/import/ header.h
Run Code Online (Sandbox Code Playgroud)

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

    g++ -DWITH_OPENSSL main.cpp soapC.cpp soapService1Proxy.cpp soapService2Proxy.cpp -lgsoapssl++ -lssl
Run Code Online (Sandbox Code Playgroud)

它返回错误

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

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

Tro*_*our 3

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

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

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