gsoap是什么

先来一段百度百科,说说gsoap是什么:

gSOAP一种跨平台的开源的C/C++软件开发工具包。生成C/C++的RPC代码,XML数据绑定,对SOAP Web服务和其他应用形成高效的具体架构解析器,它们都受益于一个XML接口。 这个工具包提供了一个全面和透明的XML数据绑定解决方案,Autocoding节省大量开发时间来执行SOAP/XML Web服务中的C/C++。此外,使用XML数据绑定大大简化了XML自动映射。应用开发人员不再需要调整应用程序逻辑的具体库和XML为中心的数据。
gSOAP支持大多数平台,包括嵌入式系统和小系统(例如嵌入式Symbian,Palm)。

最近需要做webservice的客户端c++接口代码。找到了gsoap这个开源框架,网上有一些教程,但是都是几年前的,gsoap经过几年的发展版本也升级了好多回,这些教程都有点过时,摸索了几天才总算把gsoap代码生成和编译搞定了,在这里做一些记录和总结。

下载

gsoap的下载地址:https://sourceforge.net/projects/gsoap2/files/gSOAP
我下载了最新版本2.8.33,解压到本地硬盘,gsoap安装包中本身就有编译好的win32版本(${GSOAP}\gsoap\bin\win32),所以在windows下面可以直接使用,如果是linux环境,需要自己编译。

为了不用每次都要敲长长的路径,我将${GSOAP}\gsoap\bin\win32添加到了PATH环境变量中。

wsdl2h

执行wsdl2h,会根据wsdl文件生成一个gsoap用到的头文件

wsdl2h -o facedbservice.h http://gdface.wicp.net:15865/axis2/services/FaceDbService?wsdl

-o [file] 指定输出文件名
后面的url或.wsdl .xsd 指定wsdl

关于wsd2h的详细参数说明参见wsdl2h Options

注意,这个生成出来的.h文件并不会被用于你的项目代码,它只是被提供给soap2cpp生成真正的C/C++逻辑代码的,是被gsoap自己的编译器内部使用的,所以如果你用IDE打开这个文件发现会有很多语法错误提示时不必惊讶。

生成C/C++代码

有了facedbservice.h,就可以用soapcpp2 生成C/C++代码了。

soapcpp2 -dd:\prj\gsoapclient -C -c++11 -qfacedbservice -x -IJ:\gsoap-2.8\gsoap\import facedbservice.h
参数说明:
-dpath 指定生成的源代码的路径,如果不指定该参数,默认就是当前路径
-C 只生成client端代码
-c++11 生成c++11代码,如果不指定则默认生成c++代码,如果指定-c 则生成纯c代码
-x 不生成xml示例消息文件
-qname 为所有生成代码指定c++名字空间,可以不指定,如果要同时使用多个gsoap client就要分别指定名字空间。另外如果不指定,则默认生成以soap为前缀的源代码文件,指定名字空间后,文件前缀就是name,如本例中生成的文件为:facedbserviceC.cpp,facedbserviceClient.cpp,facedbserviceH.h,facedbserviceClientLib.cpp

关于soapcpp2的详细参数说明参见soapcpp2 Options

生成envC.c---这一步很关键

如果你在没有指定-qname选项,那么可以跳过这一步
创建一个空的env.h文件,然后执行

soapcpp2 -penv env.h

生成 envC.c,envC.h,envStub.h三个文件

编译

打开vc新建一个c++项目(动态库或静态库),把$GSOAP\gsoap下的stdsoap2.cpp,stdsoap2.h,复制到你的生成代码目录下,并将stdsoap2.cpp加入项目。

如果你是multi-client and multi-server builds模式要为stdsoap2.cpp添加宏定义WITH_NONAMESPACES .

关于-DWITH_NONAMESPACES宏定义说明,参见《9.1 soapcpp2 Options》

-qname

如果你在C/C++代码时指定了-qname选项,则将facedbserviceClientLib.cpp和envC.c文件加入项目。---wsj这个很好,不用把各种头文件和不用的cpp加入项目

no -qname

如果你在C/C++代码时没有-qname选项,则将facedbserviceC.cpp,facedbserviceClient.cpp文件加入项目。---wsj同上,按需在项目中加入需要的文件

然后编译,OK

其他说明

下面是facedbserviceClientLib.cpp文件的代码,非常简单,就是包含了facedbserviceC.cpp和facedbserviceClient.cpp,并多了个WITH_NOGLOBAL,主要用于代码生成时用-qname指定了名字空间的情况。所以如果你没有指定名字空间可以在代码生成的时候用-L参数指定不生成xxxLib.cpp文件

 #ifndef WITH_NOGLOBAL
#define WITH_NOGLOBAL
#endif
#define SOAP_FMAC3 static
#include "facedbserviceC.cpp"
#include "facedbserviceClient.cpp"

为什么使用-qname参数后编译所用的文件不同,参见

《How to Build a Client or Server in a C++ Code Namespace》
《How to Create Client/Server Libraries》

关于如何调用gsoap,后续再研究。
---------------------
转自:https://blog.csdn.net/10km/article/details/52174616

wsj示例:https://files.cnblogs.com/files/liushui-sky/test_i2clntsvr.rar

gsoap入门:C/C++代码生成及编译--包含soapcpp2 -qname添加命名空间后报错的解决方法--可用的更多相关文章

  1. eclipse编译项目:Java @Override 注解报错的解决方法

    错误: 在 eclipse 的新工作空间开发项目时,出现大面积方法编译错误.鼠标放在方法名上后显示让我们去掉 @override 注解,如图: 原因: @Override 是 jdk5 引入的机制,但 ...

  2. 我的Android进阶之旅------>Android编译错误java.util.zip.ZipException: duplicate entry的解决方法

    今天在Android Studio中把另外一个项目引入当前项目,编译的时候出现了java.util.zip.ZipException: duplicate entry错误. 错误如下所示: FAILU ...

  3. libevent在windows下用visual studio编译时出现error C2894错误的原因与解决方法

    libevent是一个使用很广泛的网络库,今天想了解下它.于是去git clone了一份源码,用vs2005的命令行:nmake -f makefile.nmake编译之,顺利编译通过,生成三个静态库 ...

  4. 源码编译apache报错的解决方法

    源码编译apache报错的解决方法   问题介绍 在源码编译安装httpd时,./configure执行无错误,到make时就报错,在网络上搜索了很多文章,很多方法如换apr-util的低版本并不能很 ...

  5. maven编译java代码报“非法字符: \65279 ”错误的解决方法

    前段时间开发一个项目,使用maven进行编译时报“非法字符: \65279 ”,但是眼睛看怎么都正确的,文件转成utf-8编码还是报错. 最后没办法,暴力解决了这个问,步骤如下 1.把文件内容复制出来 ...

  6. Storm编译打包过程中遇到的一些问题及解决方法

    作者: 大圆那些事 | 文章可以转载,请以超链接形式标明文章原始出处和作者信息 网址: http://www.cnblogs.com/panfeng412/archive/2013/11/30/som ...

  7. ruby环境sass编译中文出现Syntax error: Invalid GBK character错误解决方法

    sass文件编译时候使用ruby环境,无论是界面化的koala工具还是命令行模式的都无法通过,真是令人烦恼. 容易出现中文注释时候无法编译通过,或者出现乱码,找了几天的解决方法终于解决了. 这个问题的 ...

  8. 编译uboot提示libasm-offsets.c10 error bad value (armv5)解决方法

    编译uboot-2016.09提示如下错误: lib/asm-offsets.c:1:0: error: bad value (armv5) for -march= switch 解决方法: 1.在命 ...

  9. VS2010自行编译OpenCV2.4.4时缺少python27_d.lib的解决方法

    错误 24 error LNK1104: 无法打开文件“python27_d.lib”  C:\OpenCV\VS2013_64\modules\python\LINK opencv_python 编 ...

随机推荐

  1. DWM1000 蓝点无限 PCB样板

    蓝点DWM1000 模块已经打样测试完毕,有兴趣的可以申请购买了,更多信息参见 蓝点论坛 正文: 虽然经过一段很长时间的停滞,最近调试成功,可以实现精准测距 和定位. 部分模块正在陆续整理,准备出售一 ...

  2. [Vijos1532]区间 (差分约束)

    又是一题我不会的模板题…… 讲一下差分约束吧 差分约束 参考博客 如果一个系统由n个变量和m个约束条件组成,形成m个形如ai-aj≤k的不等式(i,j∈[1,n],k为常数),则称其为差分约束系统.— ...

  3. Windbg live debug步骤

    步骤: 1.安装windbg对应版本:X86,X64 2.Attach到对应进程 3.加载SOS:.load sos clr 4.启用捕获frist chance exception: sxe clr ...

  4. linux 下通过xhost进入图形界面,经常会出现报错“unable to open display”

    linux 下通过xhost进入图形界面,经常会出现报错“unable to  open display” linux下的操作步骤如下: [root@localhost ~]# vncserver N ...

  5. ES6项目构建(babel+gulp+webpack)

    (一)基础架构 (二)任务自动化(gulp) (三)编译工具(babel,webpack) (四)代码实现 一.基础构架 1.app : 放置前端代码 css : css文件 js : js文件 cl ...

  6. Spring Boot参数校验

    1. 概述 作为接口服务提供方,非常有必要在项目中加入参数校验,比如字段非空,字段长度限制,邮箱格式验证等等,数据校验常用到概念:JSR303/JSR-349: JSR303是一项标准,只提供规范不提 ...

  7. 超过 130 个你需要了解的 vim 命令

    从 1970 年开始,vi 和 vim 就成为了程序员最喜爱的文本编辑器之一.5年前,我写了一个问自己名为 “每个程序员都应该知道的 100 个 vim 命令” 这次算是之前那篇文章的改进版,希望你会 ...

  8. Windows上的字符转换之CP_ACP和CP_OEMCP

    原文地址:http://blog.sina.com.cn/s/blog_53c1950a010158mw.html Windows API函数MultiByteToWideChar用于多字节编码字符串 ...

  9. svn文件夹解锁批处理

    清除svn文件的bat脚本整理 从svn上检出的项目,不在myeclipse工具中脱离svn的管辖,怎么办呢,下面有我的方法,也是借鉴别人的,用了特别好使,故推荐给大家. 首先创建一个xxx.bat文 ...

  10. iOS NSDictionary 转Json 去掉换行去掉空格

    //dic 转json 如果用系统自带的会出现空格. + (NSString *)returnJSONStringWithDictionary:(NSDictionary *)dictionary{ ...