前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >gsoap入门:C/C++代码生成及编译

gsoap入门:C/C++代码生成及编译

作者头像
10km
发布2019-05-25 22:15:56
3.3K0
发布2019-05-25 22:15:56
举报
文章被收录于专栏:10km的专栏10km的专栏

版权声明:本文为博主原创文章,转载请注明源地址。 https://cloud.tencent.com/developer/article/1433617

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文件加入项目。

no -qname

如果你在C/C++代码时没有-qname选项,则将facedbserviceC.cpp,facedbserviceClient.cpp文件加入项目。


然后编译,OK

其他说明

下面是facedbserviceClientLib.cpp文件的代码,非常简单,就是包含了facedbserviceC.cppfacedbserviceClient.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,后续再研究。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016年08月10日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • gsoap是什么
  • 下载
  • wsdl2h
  • 生成C/C++代码
  • 生成envC.c
  • 编译
    • -qname
      • no -qname
      • 其他说明
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档