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}\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.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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM