gSoap 编译环境搭建

本文详细介绍了如何下载并配置gSoap2,包括安装依赖的编译工具bison和flex,解决编译过程中遇到的问题,以及如何编写客户端代码与Web Service进行通信。重点在于提供了一个从下载到实现通信的完整流程,适合初学者理解和实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://sourceforge.net/projects/gsoap2 下载最新的gSoap

 在其目录下找到VisualStudio2005 可以直接在Windows环境下编译该文件

阅读readme.txt 需要安装bisonflex 两个编译软件。

分别在以下两个链接中下载。

http://gnuwin32.sourceforge.net/packages/bison.htm

http://gnuwin32.sourceforge.net/packages/flex.htm

安装时候注意目录中不要含有空格,我最开始安装的时候安装在 C:\Program Files (x86)\GnuWin32 目录下结果,在vs编译的时候,指定的目录识别有问题,最后卸载重新安装到 C:\GnuWin32 中便没有问题了。

 分别编译 soapcpp2 和 wsdl2h 两个工程。

 首先是 soapcpp2 :

打开项目便提示错误(FlexBison.rules not found):

     

 

解决办法:

下载以下的文件

http://download.microsoft.com/download/3/f/9/3f9f31b7-61a4-4dd6-9170-36d5b1d9356c/vccustombr.exe

安装,然后把FlexBison.rules文件拷贝到 gsoap/VisualStudio2005/soapcpp2 目录下面。

 

用记事本打开gsoap/VisualStudio2005/soapcpp2/soapcpp2/soapcpp2.vcproj
把里面的"RelativePath="../../../../../../../MSDN/Sample/VC++/vccustombr/FlexBison.rules"
替换成"RelativePath="./FlexBison.rules"

好了,现在再打开soapcpp2.vcproj文件,可以打开了 

在编译的时候会遇到问题,因为编译时候,soapcpp2_lex.l  soapcpp2_yacc.y 的时候,会用到flex.exe  bison.exe

下面是Flex与Bison的下载地址:

Flex and Bison

Flex only

Bison only


         
         

 

所有需要将安装的 bisonflex 设置下链接。

    

这样就编译没有问题了。

F7,又出错,无语:
lex.yy.c(746) : fatal error C1083: 无法打开包括文件:“unistd.h”: No such file or directory
Windows系统上面,VS系列IDE里面是没有该文件的,自己搞一个骗骗代码:

#ifndef _UNISTD_H__
#define _UNISTD_H__

#pragma once

#include <io.h> 
#include <process.h> 


#endif // !define(_UNISTD_H__)
把以上代码保存成unistd.h文件,然后把这个文件丢到X:/Program Files/Microsoft Visual Studio 8/VC/include 目录下面去,重新编译项目,可以了。

 编译 wsdl2h 工程,没有什么问题,可以直接编译。

 找到生成的soapcpp2.exe 和 wsdl2h.exe 。

 下面开始 编写个客户端跟Web Service 服务端通信。

 ClientPlaceService.wsdl 服务端 wsdl 的内容如下

<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.1.3-hudson-390-. -->
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://Server/" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="ClientPlaceService" targetNamespace="http://Server/">
  <types>
    <xsd:schema>
      <xsd:import namespace="http://Server/" schemaLocation="ClientPlaceService_schema1.xsd"/>
    </xsd:schema>
  </types>
  <message name="LoginByPassWord">
    <part element="tns:LoginByPassWord" name="parameters"/>
  </message>
  <message name="LoginByPassWordResponse">
    <part element="tns:LoginByPassWordResponse" name="parameters"/>
  </message>
  <message name="UpdateMoney">
    <part element="tns:UpdateMoney" name="parameters"/>
  </message>
  <message name="UpdateMoneyResponse">
    <part element="tns:UpdateMoneyResponse" name="parameters"/>
  </message>
  <portType name="ClientPlaceDelegate">
    <operation name="LoginByPassWord">
      <input message="tns:LoginByPassWord"/>
      <output message="tns:LoginByPassWordResponse"/>
    </operation>
    <operation name="UpdateMoney">
      <input message="tns:UpdateMoney"/>
      <output message="tns:UpdateMoneyResponse"/>
    </operation>
  </portType>
  <binding name="ClientPlacePortBinding" type="tns:ClientPlaceDelegate">
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <operation name="LoginByPassWord">
      <soap:operation soapAction=""/>
      <input>
        <soap:body use="literal"/>
      </input>
      <output>
        <soap:body use="literal"/>
      </output>
    </operation>
    <operation name="UpdateMoney">
      <soap:operation soapAction=""/>
      <input>
        <soap:body use="literal"/>
      </input>
      <output>
        <soap:body use="literal"/>
      </output>
    </operation>
  </binding>
  <service name="ClientPlaceService">
    <port binding="tns:ClientPlacePortBinding" name="ClientPlacePort">
      <soap:address location="http://localhost:8080/DwPadWS/ClientPlacePort"/>
    </port>
  </service>
</definitions>

链接的服务器的地址为:

http://192.168.18.129:8080/DwPadWS/ClientPlacePort?wsdl

 

这样我们做一个test_xm文件夹 开始写测试程序吧。

soapcpp2.exe 和 wsdl2h.exe 拷贝到 test_xm 目录下。

运行cmd 命令行。

 wsdl2h -o DwPadWS.h http://192.168.18.129:8080/DwPadWS/ClientPlacePort?wsdl

 soapcpp2 -i -C -x DwPadWS.h -I ..\gsoap\import

命令选项注释:

-i 直接使用C++包装类 -x 不要生成一堆看了就恶心的xml -C 只生成客户端相关代码 -I 指定import路径

 此时生成 如下

         
用vs创建工程 test,为了方便建一个命令行的工程,将上面的 所有文件(不包括exe文件)、以及gsoap目录下的stdsoap2.hstdsoap2.cpp文件拷贝工程目录下,并加到工程中。

#include "stdafx.h"
#include "soapClientPlacePortBindingProxy.h"
#include "ClientPlacePortBinding.nsmap"

int _tmain(int argc, _TCHAR* argv[])
{
    ClientPlacePortBindingProxy kDwPadWS;

    ns1__LoginByPassWord PassWord;
    PassWord.arg0 = 0;
    std::string strUserName = "test02";
    PassWord.arg1 = &strUserName;
    std::string strPassWord = "123";
    PassWord.arg2 = &strPassWord;
    std::string strPCID = "nothing";
    PassWord.arg3 = &strPCID;
    ns1__LoginByPassWordResponse PassWordResponse;
    PassWordResponse.return_ = 0;
    if( kDwPadWS.LoginByPassWord(&PassWord, &PassWordResponse) == SOAP_OK )
    {
        std::cout << PassWordResponse.return_ << std::endl;
    }
    else
    {
        kDwPadWS.soap_stream_fault(std::cerr);
    }
    Sleep(5000);

    return 0;
}


### 配置和设置 Gsoap 开发环境 #### 设置 PATH 环境变量 为了使命令行能够识别并找到所需的编译器和其他工具,在终端中执行如下命令来更新 `PATH` 环境变量[^1]: ```bash export PATH=/usr/local/linaro-multilib-2014.06-gcc4.9:$PATH ``` 此操作会将指定路径添加到现有 `PATH` 的开头位置,从而优先使用该目录下的可执行文件。 #### 编译安装 gSOAP 工具 按照官方文档说明完成源码下载之后,进入解压后的 gSOAP 文件夹内运行以下指令来进行编译与全局安装过程[^2]: ```bash ./configure make sudo make install ``` 上述命令依次完成了配置项目参数、构建目标程序以及将其复制至系统的标准库路径之中。完成后可通过输入 `which soapcpp2` 来确认是否正确安装了核心组件之一——`soapcpp2` 生成器。 #### 创建测试工程验证安装成果 创建一个新的工作空间用于存放即将编写的服务端或客户端应用程序代码,并通过简单的例子检验整个流程无误: ```c++ // hello.cpp : 定义控制台应用程序的入口点。 #include "soapH.h" #include "ns.nsmap" int main() { struct ns__helloWorldResponse resp; int ret = soap_call_ns__helloWorld(NULL, NULL, "", &resp); printf("%s\n", resp.result ? resp.result : "(null)"); } ``` 这段 C++ 代码片段展示了如何利用 gSOAP 库发起一次远程方法调用请求给 Web Service 接口;其中涉及到了两个由 WSDL 自动生成的数据结构定义头文件 `"soapH.h"` 和命名空间映射表 `"ns.nsmap"`[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值