环境
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编译生成的库
---
以上就是我全部的测试过程,使用不当的地方,还请留言指正。