Chinaunix首页 | 论坛 | 博客
  • 博客访问: 565477
  • 博文数量: 127
  • 博客积分: 1169
  • 博客等级: 少尉
  • 技术积分: 1298
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-16 14:29
个人简介

空白

文章分类

全部博文(127)

分类: C/C++

2014-04-24 16:36:29

第一部分 使用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文件拷贝到第一部分生成文件目录。

点击(此处)折叠或打开


  1. #include "MainServletImplServiceSoapBinding.nsmap"
  2. #include "soapMainServletImplServiceSoapBindingProxy.h"

  3. QString WsFunc::invokeWs(std::string cmdString)
  4. {
  5.     int result = 0;                    
  6.     struct soap invokews_soap;
  7.     ns1__invokews in;
  8.     ns1__invokewsResponse out;

  9.     soap_init(&invokews_soap);                            

  10.     soap_set_mode(&invokews_soap, SOAP_C_UTFSTRING);   //直接返回数据包含中文    

  11.     soap_set_namespaces(&invokews_soap, namespaces);

  12.     MainServletImplServiceSoapBindingProxy MainServlet(&invokews_soap);

  13.     in.arg0 = &cmdString;

  14.     result = MainServlet.invokews(&in, &out);

  15.     //Get the result data
  16.     if (0 == result)
  17.     {
  18.         //printf("%s \r\n", out.return_->c_str());
  19.         std::vector<char> vcOut;
  20.         int iRetLen = strlen(out.return_->c_str());
  21.         vcOut.resize(iRetLen + 1);
  22.         strncpy(&vcOut[0], out.return_->c_str(), iRetLen + 1);
  23.         QByteArray m_Byte = QByteArray(&vcOut[0]);
  24.         MainServlet.destroy();
  25.         return QString(m_Byte);
  26.     }
  27.     else
  28.     {
  29.         printf("result: %d, %s \r\n", result, MainServlet.soap_fault()->faultstring);
  30.         MainServlet.destroy();
  31.         return "";
  32.     }
  33. }
函数返回结果即为服务器返回数据。

第三部分  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) |
给主人留下些什么吧!~~