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.cpp和facedbserviceClient.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