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. Linux引导程序类型

    Bootloader Monitor 描述 X86 ARM PowerPC LILO 否 Linux磁盘引导程序 是 否 否 GRUB 否 GNU的LILO替代程序 是 否 否 Loadlim 否 从 ...

  2. Node辅助工具NPM&REPL

    Node辅助工具NPM&REPL NPM和REPL是node的包管理器和交互式解析器,可以有效提高开发者效率 NPM npm(Node Package Manager)是node包管理器,完全 ...

  3. PAT Basic 1012

    1012 数字分类 (20 分) 给定一系列正整数,请按要求对数字进行分类,并输出以下 5 个数字: A​1​​ = 能被 5 整除的数字中所有偶数的和: A​2​​ = 将被 5 除后余 1 的数字 ...

  4. Java基础知识总结--final、finally、finalize的区别

    谈谈final.finally.finalize的区别 1.final修饰符:如果一个类被声明为final,意味着这个类不能再被派生出新的子类,不能作为父类被别的类继承.因此,一个类不能即被声明为ab ...

  5. bzoj 1008

    记得取模时对答案的处理 #include<bits/stdc++.h> #define ll long long using namespace std; ; ll qpow(ll a,l ...

  6. GMA Round 1 年货

    传送门 年货 三角形的年货有没有见过啊?(如下图所示,图中共有12层小三角形,共计144个) 啊,不,这不是真正的年货,真正的年货是正六边形的!(这是什么设定?) 总之,麻烦你在图中找出顶点在三角形格 ...

  7. openstack 之~openstack各组件关系

    认识openstack 第一:openstack是什么? OpenStack是一个由NASA(美国国家航空航天局)和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项 ...

  8. Atcoder4105 Same Integers(模拟)

    https://abc093.contest.atcoder.jp/tasks/arc094_a?lang=en 思路题还是不太会做哈.感觉数据不大,一开始dfs做但是发现不是最优解,一想确实是这么一 ...

  9. nvidia-docker2配置与NVIDIA驱动安装

    要运行高版本的GPU版TensorFlow,需要更新宿主机的显卡驱动(本文以NVIDIA390为例) 一.更新驱动 禁用nouveau驱动: 添加/etc/modprobe.d/blacklist.c ...

  10. 使用log4net生成日志文件

    (一)使用log4net生成日志文件   1.引入log4net.dll 1.1 Nuget安装 或 http://logging.apache.org/log4net/下载log4net的源代码,编 ...