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. JavaScript—异步提交表单的6种方式

    FormData的详细介绍及使用请点击此处,那里对FormData的方法和事件已经表述的非常清楚,这里就不再浪费时间在介绍一遍了.本文主要针对FormData对象的使用以及异步文件上传进行详细的说明. ...

  2. 潭州课堂25班:Ph201805201 django 项目 第三十三课 后台文章标签查询提交到前台,删除功能实现(课堂笔记)

    在视图中创建个类,要实现此功能,并把结果返回前台 , from django.shortcuts import render from django.views import View from dj ...

  3. 利用Spring的junit4测试

    利用Spring的JUnit4进行测试 不需要再显式创建Spring容器和getBean @RunWith(SpringJUnit4ClassRunner.class) @ContextConfigu ...

  4. BZOJ4422 : [Cerc2015]Cow Confinement

    从右往左扫描线,用线段树维护扫描线上每一个点能达到的花的数量,并支持最近篱笆的查询. 对于一朵花,找到它上方最近的篱笆,那么它对这中间的每头牛的贡献都是$1$. 当扫到一个篱笆的右边界时,这中间的答案 ...

  5. Java 消除过期的对象引用

    内存泄漏的第一个常见来源是存在过期引用. import java.util.Arrays; import java.util.EmptyStackException; public class Sta ...

  6. python添加、修改、删除、访问类对象属性的2种方法

    1.直接添加.修改.删除.访问类对象属性 class Employee (object): empCount = 0 def __init__(self, name, salary) : self.n ...

  7. Tips_方格拼图效果

    用原生的javascript实现方格拼图效果 1.新建文件夹 代码如下: 01.html <!DOCTYPE html> <html lang="en"> ...

  8. JAVA自学笔记06

    JAVA自学笔记06 1.二维数组 1)格式: ①数据类型[][]数组名 = new 数据类型[m][n]; 或 数据类型[]数组名[]=new 数据类型[m][n]; m表示这个二维数组有多少个一维 ...

  9. JDBC(14)—对DAO进行改进修改

    结构: DAO2_7< T >(接口)->DAOTestImpl< T >(实现类)->CustomerDAO(继承的子类)->CustomerDAOTest ...

  10. Python的ctypes 和pyinstaller

    这几天在学习python的爬虫, 无意中看到一篇博文 Python爬虫之自制英汉字典 发现里面的ctypes 和pyinstaller 还不了解,这边文章说白了就是你输入英文, python读取你的输 ...