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


    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.cppfacedbserviceClient.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

  • 相关阅读:
    ajaxfileupload
    ASP.NET从MVC5升级到MVC6
    jvm(13)-线程安全与锁优化(转)
    成为顶尖自由职业者必备的7个软技能之一:沟通(转)
    在ubuntu安装Phabricator(转)
    查看mysql当前表使用的存储引擎(转)
    在Java中如何使用jdbc连接Sql2008数据库(转)
    漂亮的ActionBar效果
    Android smartimageview网络图片查看器
    Android 图板之保存图像
  • 原文地址:https://www.cnblogs.com/liushui-sky/p/9816630.html
Copyright © 2020-2023  润新知