我正在在同一应用程序中使用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中进行了所有常规的 namespace 修改。现在,我发现我有两个.cpp和.h文件,它们的类型分别为soapService1Proxy.cpp/h和soapService2Proxy.cpp/h。这并不是我所期望的,但是无论如何,我在主函数中同时包含了两个 header ,并创建了每个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文档,但根本无法解决此问题。
最佳答案
我从未使用过SOAP,但快速浏览了this user guide。
section 7.1.4的最后一段说,-n
的-p
和soapcpp2
选项有助于解决链接冲突。那里的section 19.35链接提供了更多信息。似乎您必须使用wsdl2h
选项在每个文件上分别运行-q
,以便为每个文件提供一个C++ namespace 。然后,当您运行soapcpp2
时,它将自动应用-p
,而您所要做的就是提供-n
,以使namespaces
数组以您的C++ namespace 名称为前缀,后跟一个下划线。
我没有尝试过任何方法,但希望这足以
让你再去一次。
关于c++ - 将gSOAP与2个不同的wsdl文件一起使用时的链接器错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10220155/