概述
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}gsoapbinwin32
),所以在windows下面可以直接使用,如果是linux环境,需要自己编译。
为了不用每次都要敲长长的路径,我将${GSOAP}gsoapbinwin32
添加到了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:prjgsoapclient -C -c++11 -qfacedbservice -x -IJ:gsoap-2.8gsoapimport 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++项目(动态库或静态库),把$GSOAPgsoap下的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
文件加入项目。
no -qname
如果你在C/C++代码时没有-qname选项,则将facedbserviceC.cpp,facedbserviceClient.cpp文件加入项目。
然后编译,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,后续再研究。
最后
以上就是风趣眼神为你收集整理的gsoap入门:C/C++代码生成及编译gsoap是什么下载wsdl2h生成C/C++代码生成envC.c编译其他说明的全部内容,希望文章能够帮你解决gsoap入门:C/C++代码生成及编译gsoap是什么下载wsdl2h生成C/C++代码生成envC.c编译其他说明所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复