我正在使用 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 文档,但根本无法解决这个问题。