1. 程式人生 > >gsoap入門:C/C++程式碼生成及編譯--包含soapcpp2 -qname新增名稱空間後報錯的解決方法--可用

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