Чтобы наконец-то все заработало, мне пришлось портировать gSOAP, чтобы использовать stdapis
вместо libc
. Я удалил одну из <netinet\tcp.h>
строк и использовал <sys/select.h>
.
Портированный файл stdsoap2.h
можно найти по адресу http://pastebin.com/xnrDbfFa.
Я также обнаружил, что Symbian не загружает STL по умолчанию, поэтому все мои методы, которые возвращали std::vector
и std::string
, теперь не компилируются.
Вместо того чтобы выбрать флаг -s
для отключения использования STL, я добавил порт Symbian STL к INCLUDEPATH
в файле .pro
, например
symbian {
INCLUDEPATH += $$EPOCROOT\epoc32\include\stdapis\stlport
INCLUDEPATH += $$EPOCROOT\epoc32\include\stdapis\stlport\stl
}
А в soapStub.h
пришлось включить
#include <vector>
#include <string>
Также вам необходимо изменить typemap.dat
и добавить следующее, чтобы иметь возможность компилировать.
# Symbian specific
xsd__dateTime = | std::string
xsd__long = | long
xsd__unsignedLong = | unsigned long
xsd__int = | int
В противном случае компилятор будет жаловаться на
'soap_outdateTime' was not declared in this scope
'soap_indateTime' was not declared in this scope
, поскольку в Symbian gSOAP создается с флагом WITH_LEAN
, поэтому некоторые вещи отключены (например, не поддерживается сериализация time_t
и не поддерживается сериализация LONG64
/ ULONG64
) требуется typemap.dat
переопределяет выше.
Наконец, для дальнейшего использования, вот аргументы командной строки, которые я использовал для генерации файлов:
wsdl2h.exe -o service.h http://myservicelocation.com/DataDisplayingWCF.svc?wsdl
А потом:
soapcpp2.exe -I "C:\gsoap-2.7\gsoap\custom;C:\gsoap-2.7\gsoap\import" "service.h" -ixw
Вы также можете настроить пространства имен в typemap.dat
и выполнить регенерацию с помощью wsdl2h
.