我正在使用同一应用程序中的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文档,但根本无法解决这个问题。
答案 0 :(得分:3)
我从未使用过SOAP,但我快速浏览了this user guide。
section 7.1.4中的最后一段说明-n
的{{1}}和-p
选项有助于解决链接冲突。 section 19.35的链接提供了更多信息。您似乎必须使用soapcpp2
选项分别在每个文件上运行wsdl2h
,以便为每个文件提供C ++命名空间。然后,当您运行-q
时,它将自动应用soapcpp2
,您需要做的只是提供-p
数组,前缀为您的C ++命名空间名称,后跟下划线
我没有尝试过这些,但希望这足够了 让你再去。