MinGW环境使用gSOAP

环境

WindowsXP SP3,MinGW 5.1.4,Cygwin,CMake 2.6(可有可无)

 

编译

首先,下载gsoap:http://sourceforge.net/project/showfiles.php?group_id=52781

 

解压缩后执行

cd /libpath/
./configure --enable-samples=no

 

做如下修改:

/*  Portability: define SOAP_SOCKLEN_T  */
#if  defined(_AIX)
if  defined(_AIX43)
#  define SOAP_SOCKLEN_T socklen_t
else
#  define SOAP_SOCKLEN_T 
int
# endif
#elif  defined(SOCKLEN_T)
# define SOAP_SOCKLEN_T SOCKLEN_T
#elif  defined(__socklen_t_defined) || defined(_SOCKLEN_T) || defined(CYGWIN) || defined(FREEBSD) || defined(__FreeBSD__) || defined(__QNX__) || defined(QNX) || defined(OS390)
# define SOAP_SOCKLEN_T socklen_t
#elif  defined(IRIX) || defined(WIN32) || defined(__APPLE__) || defined(HP_UX) || defined(SUN_OS) || defined(OPENSERVER) || defined(TRU64) || defined(VXWORKS)
# define SOAP_SOCKLEN_T 
int
#else
# define SOAP_SOCKLEN_T size_t
#endif

// 修改为

/*  Portability: define SOAP_SOCKLEN_T  */
#if  defined(_AIX)
if  defined(_AIX43)
#  define SOAP_SOCKLEN_T socklen_t
else
#  define SOAP_SOCKLEN_T 
int
# endif
#elif  defined(SOCKLEN_T)
# define SOAP_SOCKLEN_T SOCKLEN_T
#elif  defined(__socklen_t_defined) || defined(_SOCKLEN_T) || defined(CYGWIN) || defined(FREEBSD) || defined(__FreeBSD__) || defined(__QNX__) || defined(QNX) || defined(OS390)
# define SOAP_SOCKLEN_T 
int
#elif  defined(IRIX) || defined(WIN32) || defined(__APPLE__) || defined(HP_UX) || defined(SUN_OS) || defined(OPENSERVER) || defined(TRU64) || defined(VXWORKS)
# define SOAP_SOCKLEN_T 
int
#else
# define SOAP_SOCKLEN_T size_t
#endif

 

因为在编译的过程中发现make一直创建快捷方式,都指向stdsoap2.cpp和stdsoap2.c两个文件,而在make的过程中对快捷方式又总提示not found,于是这一步可以这么做:

cd /libpath/gsoap
cp stdsoap2.cpp stdsoap2_cpp.cpp
cp stdsoap2.c stdsoap2_ck.c
cp stdsoap2.cpp stdsoap2_ck_cpp.cpp
cp stdsoap2.c stdsoap2_ssl.c
cp stdsoap2.cpp stdsoap2_ssl_cpp.cpp


然后执行

cd /libpath
make

 

结果是报错的,提示找不到yacc。但是这个时候已经生成了所需要的库,于是我就没继续往下编译。

 

使用

使用就很简单了,网上的相关文章很多,简单用PHP的nuSOAP写一个服务端gSOAP做客户端测试一下。

PHP代码如下:

<? php 
require_once   ' nusoap/nusoap.php ' ;

function  hello() {
    
return   ' 中文? ' ;
}
function  test1( $str1 ,   $str2 ) {
    
return   ' S1: ' . $str1 . ' ,S2: ' . $str2 ;
}

$soap   =   new  soap_server();
$soap -> soap_defencoding  =   ' UTF-8 ' ;
$soap -> decode_utf8  =   false

$soap -> configureWSDL( ' test1 ' );
$soap -> register( ' hello ' ,  
    
array () ,  
    
array ( " return " => " xsd:string " ));
$soap -> register( ' test1 ' ,  
    
array ( " str1 " => ' xsd:string ' ,   " str2 " => " xsd:string " ) ,
    
array ( " result " => " xsd:string " ));
$soap -> service( $HTTP_RAW_POST_DATA );

 

把gsoap下的bin设置环境变量,然后执行:

wsdl2h -o hello.h http://jaypei.cnblogs.com/.../nusoap_test1.php?wsdl
soapcpp2 -IX:\...\gsoap\import -C -i hello.h

可以把它放到一个单独目录中然后写一个批处理去做。

main.cc如下:

#include  < iostream >
#include 
< string >
#include 
" soaptest1BindingProxy.h "
#include 
" test1Binding.nsmap "
#include 
" stdsoap2.h "

using   namespace  std;

int  main( int  argc,  char **  argv) 
{

    test1BindingProxy proxy(SOAP_C_UTFSTRING);
    
string  result;
    
if  (proxy.hello(result)  ==  SOAP_OK) {
        cout 
<< result  <<  endl;
    }

    
return   0 ;
}

 

一定要加SOAP_C_UTFSTRING,说明使用UTF8.

假设目录service_header为批处理的目录,执行后,主目录CmakeLists.txt如下:

SET(SRC_FILES main.cc)
INCLUDE_DIRECTORIES(
    
" service_header "
    
" X:\...\gsoap "
)
LINK_DIRECTORIES(
    
" service_header "
    
" X:\...\gsoap "
)
ADD_SUBDIRECTORY(
    
" service_header "
)
ADD_EXECUTABLE(main ${SRC_FILES})

TARGET_LINK_LIBRARIES(main 
    
" wservice_test1 "
    
" gsoap++ "
    
" wsock32.lib "
)


service_header/CmakeLists.txt内容如下:

SET(SRC_FILES 
    
" soaptest1BindingProxy.cpp "
    
" soapC.cpp "
)
ADD_LIBRARY(wservice_test1 STATIC ${SRC_FILES})

 


调试成功!

链接的时候记得要加上gsoap++库、wsock32.lib和webservice编译生成的库

 

---

以上就是我全部的测试过程,使用不当的地方,还请留言指正。


你可能感兴趣的:(MinGW)