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}gsoapinwin32),所以在windows下面可以直接使用,如果是linux环境,需要自己编译。
为了不用每次都要敲长长的路径,我将${GSOAP}gsoapinwin32添加到了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文件加入项目。---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文件
1 #ifndef WITH_NOGLOBAL 2 #define WITH_NOGLOBAL 3 #endif 4 #define SOAP_FMAC3 static 5 #include "facedbserviceC.cpp" 6 #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