Я пишу клиент веб-службы C++, используя gSOAP в linux, используя 2 отдельных файла wsdl в одном приложении. Мне удалось заставить все работать только с одним файлом wsdl, и после прочтения документации я прошел через процесс использования wsdl2h для обоих файлов:
wsdl2h -o header.h wsdlfile1.wsdl wsdlfile2.wsdl
Это сработало нормально, и я тогда сделал
soapcpp2 -i -I/usr/share/gsoap/import/ header.h
Затем я сделал все обычное пространство имен изменения в typemap.dat в соответствии с инструкциями. Теперь я обнаружил, что у меня есть два файла .cpp и .h типа soapService1Proxy.cpp/h и soapService2Proxy.cpp/h. Это не совсем то, что я ожидал, но, тем не менее, я включил оба заголовка в свою основную функцию и создал экземпляры каждого класса 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
. Я знаю, что «пространства имен» относятся к массиву в файлах .nsmap (которые в этом случае идентичны для каждого wsdl). Я включил только один из них, поскольку компилятор жалуется на множественное определение, если я включаю оба. Я был бы очень признателен, если бы кто-нибудь мог сказать мне, что я здесь делаю неправильно, поскольку я пытался максимально точно следовать рекомендациям и документам gSOAP, но просто не могу решить эту проблему.