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

时间:2012-04-19 00:47:20

标签: c++ gsoap

我正在使用同一应用程序中的2个单独的wsdl文件在linux上使用gSOAP编写C ++ Web服务客户端。我设法只使用一个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文件。这不是我所期望的,但无论如何,我在我的main函数中包含了两个头文件并创建了每个Proxy类的实例,并且使用的方式与我只使用一个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

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

1 个答案:

答案 0 :(得分:3)

我从未使用过SOAP,但我快速浏览了this user guide

section 7.1.4中的最后一段说明-n的{​​{1}}和-p选项有助于解决链接冲突。 section 19.35的链接提供了更多信息。您似乎必须使用soapcpp2选项分别在每个文件上运行wsdl2h,以便为每个文件提供C ++命名空间。然后,当您运行-q时,它将自动应用soapcpp2,您需要做的只是提供-p数组,前缀为您的C ++命名空间名称,后跟下划线

我没有尝试过这些,但希望这足够了 让你再去。