第一部分 使用gsoap配套工具生成客户端代码
1、根据wsdl生成mbrClient.h文件
/opt/gsoap/bin/wsdl2h -I/home/sar/gsoap/gsoap-2.8/gsoap -o client.h
2、根据mbrClient文件生成客户端代码,-C:只生成客户端代码,-c:生成纯c代码
/opt/gsoap/bin/soapcpp2 -C -L -j -x -I/home/sar/gsoap/gsoap-2.8/gsoap/import client.h
通过上面2步后,得到如下文件:
第二部分 编写客户端实现代码
先将gsoap源码目录下(/home/sar/gsoap/gsoap-2.8/gsoap/)stdsoap2.h, stdsoap2.cpp文件拷贝到第一部分生成文件目录。
-
-
#include "MainServletImplServiceSoapBinding.nsmap"
-
#include "soapMainServletImplServiceSoapBindingProxy.h"
-
-
QString WsFunc::invokeWs(std::string cmdString)
-
{
-
int result = 0;
-
struct soap invokews_soap;
-
ns1__invokews in;
-
ns1__invokewsResponse out;
-
-
soap_init(&invokews_soap);
-
-
soap_set_mode(&invokews_soap, SOAP_C_UTFSTRING); //直接返回数据包含中文
-
-
soap_set_namespaces(&invokews_soap, namespaces);
-
-
MainServletImplServiceSoapBindingProxy MainServlet(&invokews_soap);
-
-
in.arg0 = &cmdString;
-
-
result = MainServlet.invokews(&in, &out);
-
-
//Get the result data
-
if (0 == result)
-
{
-
//printf("%s \r\n", out.return_->c_str());
-
std::vector<char> vcOut;
-
int iRetLen = strlen(out.return_->c_str());
-
vcOut.resize(iRetLen + 1);
-
strncpy(&vcOut[0], out.return_->c_str(), iRetLen + 1);
-
QByteArray m_Byte = QByteArray(&vcOut[0]);
-
MainServlet.destroy();
-
return QString(m_Byte);
-
}
-
else
-
{
-
printf("result: %d, %s \r\n", result, MainServlet.soap_fault()->faultstring);
-
MainServlet.destroy();
-
return "";
-
}
-
}
函数返回结果即为服务器返回数据。
第三部分 gsoap 移植到arm-linux下
1 设置配置参数,同步编译sample目录
./configure --help /* 查看configure帮助选项 */
./configure --host=arm-arago-linux --prefix=/opt/gsoap --disable-ssl --enable-samples CC=/usr/local/cross/am335xt3/devkit/bin/arm-arago-linux-gnueabi-gcc CXX=/usr/local/cross/am335xt3/devkit/bin/arm-arago-linux-gnueabi-g++
2 上述configure执行后会自动生成配置文件gsoap-2.8\config.h,该文件有错误,必须手动修改:
#define malloc rpl_malloc --> //#define malloc rpl_malloc
3 修改下列文件,目的是添加头文件#include ,避免编译出错。
gsoap-2.8\gsoap\dom_cpp.cpp
gsoap-2.8\gsoap\stdsoap2_cpp.cpp
gsoap-2.8\gsoap\stdsoap2_ck_cpp.cpp
gsoap-2.8\gsoap\stdsoap2_ssl_cpp.cpp
gsoap-2.8\gsoap\wsdl\types.h
4 修改gsoap\src\Makefile,屏蔽这两行,目的是不生成arm平台的soapcpp2可执行文件。
#@rm -f soapcpp2$(EXEEXT)
#$(soapcpp2_LINK) $(soapcpp2_OBJECTS) $(soapcpp2_LDADD) $(LIBS)
5 修改gsoap\wsdl\Makefile,屏蔽这两行,目的是不生成arm平台的wsdl2h可执行文件。
#@rm -f wsdl2h$(EXEEXT)
#$(wsdl2h_LINK) $(wsdl2h_OBJECTS) $(wsdl2h_LDADD) $(LIBS)
6 完整的make过程需要在linux服务器上运行soapcpp2,因此必须把将soapcpp2复制到gsoap\src\,
同理将wsdl2h复制到gsoap\wsdl。
cp gsoap/bin/linux386/soapcpp2 gsoap/src
cp gsoap/bin/linux386/wsdl2h gsoap/wsdl
7 运行 make,完成编译全过程。
make
8 make install
安装后在\\192.168.0.234\work\gaoht\gsoap\target\生成以下目录:
\bin
\include
\lib
\share
第四部分 编译过程错误说明
1 不修改gsoap-2.8\config.h,编译会提示:
stdsoap2_cpp.cpp:2093: 错误:‘malloc’在此作用域中尚未声明
链接时提示未找到rpl_malloc。
2 不添加头文件#include ,会提示:
stdsoap2_cpp.cpp:2093: 错误:‘malloc’在此作用域中尚未声明
3 未修改gsoap\wsdl\Makefile、gsoap\src\Makefile,未拷贝soapcpp2、wsdl2h,编译会提示:
../../gsoap/src/soapcpp2: ../../gsoap/src/soapcpp2:无法执行二进制文件
阅读(3269) | 评论(0) | 转发(0) |