无法编译使用gSOAP的Qt Symbian应用程序

时间:2010-09-08 14:10:46

标签: qt symbian gsoap

我正在使用gSOAP和Qt for Symbian。

在模拟器下,应用程序编译正常,但是当我更改编译器的目标以编译设备时,我收到以下错误。

WARNING: Can't find following headers in System Include Path 
<netinet\tcp.h> 

这包含在stdsoap2.h文件中,如下所示:

#ifndef WITH_NOIO
# ifndef WIN32
#  ifndef PALM
#   include <sys/socket.h>
#   ifdef VXWORKS
#    include <sockLib.h>
#    include <selectLib.h>
#    ifndef _WRS_KERNEL
#     include <strings.h>
#    endif
#   else
#    ifndef SYMBIAN
#     include <strings.h>
#    endif
#   endif
#   ifdef SUN_OS
#    include <sys/stream.h>     /* SUN */
#    include <sys/socketvar.h>      /* SUN < 2.8 (?) */
#   endif
#   ifdef VXWORKS
#    ifdef _WRS_KERNEL
#     include <sys/times.h>
#    endif
#   else
#    include <sys/time.h>
#   endif
#   include <netinet/in.h>
#   ifdef OS390
#    include <netinet/tcp_var.h>
#   else
#     include <netinet/tcp.h>          /* TCP_NODELAY */
#   endif
#   include <arpa/inet.h>
#  endif
# endif
#endif

我很难过!无法在任何地方找到该文件..

2 个答案:

答案 0 :(得分:2)

此标题由S60 SDK提供,位于:

%EPOCROOT%\epoc32\include\libc\netinet\tcp.h

因此,为了正确解析#include <netinet\tcp.h>,您的MMP文件需要包含以下行:

SYSTEMINCLUDE /epoc32/include/libc

答案 1 :(得分:2)

为了最终使其工作,我不得不移植gSOAP以使用stdapis而不是libc。我删除了其中一条<netinet\tcp.h>行并改为使用<sys/select.h>

您可以在http://pastebin.com/xnrDbfFa找到移植的stdsoap2.h文件。

我还发现Symbian默认不加载STL,所以我所有返回std::vectorstd::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 / { {1}}序列化)因此上面需要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重新生成。