Мы использовали gSOAP, а не Axis, чтобы избежать зависимости как от JRE, так и от Axis только для создания проекта C ++. Он работает нормально, что хорошо, так как код gSOAP ужасен и делает очень трудным исправление любых ошибок в нем.
Предупреждение о связывании gSOAP: вы никогда не можете использовать более одного WSDL в одном объекте ссылки (исполняемый файл, dll, общий объект). Это связано с тем, что некоторые из созданных специфичных для WSDL функций имеют общие имена (например, soap_getfault ()).
Хуже того, при связывании Unix ELF эти имена будут вызывать перекрестное связывание между общими объектами, поэтому ошибка FooService может быть обработана soap_getfault () для BarService, что приведет к повреждению памяти, если структуры детализации ошибок отличаются.
Обходной путь для этого - убедиться, что ничего, связанного с gSOAP, не открыто вне SO, с которым они связаны. Эту проблему можно решить, предоставив gcc следующие определения при подключении самой библиотеки gSOAP и связывании вашего кода:
#define SOAP_FMAC2 __attribute__ ((visibility ("hidden")))
#define SOAP_FMAC4 __attribute__ ((visibility ("hidden")))
#define SOAP_FMAC6 __attribute__ ((visibility ("hidden")))
#define SOAP_NMAC __attribute__ ((visibility ("hidden")))
Я решил это, поместив их в заголовочный файл и заставив gcc включить это прежде всего с -include fixsoaplink.h
.
Лучший способ, если вы можете предпринять усилия, - изменить видимость ELF по умолчанию на скрытую и экспортировать только те символы, которые вы хотите (например, dllimport / dllexport в VC).