VS編譯protobuf
① 如何在Windows環境下的VS中安裝使用Google Protobuf完成SOCKET通信
1.下載protobuff,我下的是2.3.0版本
最新的protobuf可以到Google Code上下載:http://code.google.com/p/protobuf/downloads/list
當前版本為2.3.0,下載兩個壓縮包:protoc-2.3.0-win32.zip和protobuf-2.3.0.zip,前者是protobuf的編譯器,後者包含了有三程序語言的開發包。
2.解壓
首先解壓protoc-2.3.0-win32.zip,把protoc.exe文件放到path路徑中,最簡單的做法就是把這個文件拷貝到C:/WINDOWS目錄下。
解壓protobuf-2.3.0.zip文件,將文件加壓到C盤根目錄,主文件位於C:/protobuf-2.3.0/protobuf-2.3.0目錄下。
3.安裝操作
(1)使用VS2005編譯proto,VS工程目錄位於vsprojects目錄中,工程名字為「protobuf.sln」。
(2)選擇「生成」à「生成解決方案」選項進行編譯,編譯過程中可能會由於編譯的順序報錯誤,可以使用手工逐個順序編譯生成,可能會比較順利。按照下圖的順序,右鍵「重新生成」,逐個編譯。但是我在實習操作過程中,libprotobuf-lite工程重來都沒有成功編譯通過過。淡定先,這個不會影響大局的。
(3)編譯完成會在目錄vsprojects下的Debug目錄中生成lib和exe文件。
生成清單如下:
exe文件:
2010-04-15 09:51 950,272 lite-test.exe
2010-04-15 09:50 3,219,456 protoc.exe
2010-04-15 09:48 9,228,288 tests.exe
2010-04-15 09:56 2,519,040 test_plugin.exe
lib文件:
2010-04-15 09:50 2,685,922 libprotobuf-lite.lib
2010-04-15 09:56 24,100,794 libprotobuf.lib
2010-04-15 09:56 17,302,068 libprotoc.lib
其實我在測試過程中,lite-test.exe和libprotobuf-lite.lib並沒有生成,因為編譯錯誤了,但這並不影響大局,淡定先。
(4)OK,至此,我們已經完成了編譯工作,下面需要進行的是protobuf的測試。我們需要使用到之前VS編譯出來的libprotobuf.lib和libprotoc.lib完成一個C/S結構的SOCKET通信測試。
àProtobuf的測試
在VS2005下,創建兩個新的工程,分別命名為server和client,每個工程都需要引用protobuf的頭文件和lib文件。
一、添加protobuf頭文件操作:右擊項目à屬性à配置屬性àC/C++à常規 (也命令行可在中添加)。具體路徑:C:/protobuf-2.3.0/protobuf-2.3.0/src
二、添加protobuf的lib文件操作:右擊項目à屬性à配置屬性à鏈接器à常規(也可在命令行中添加)。具體路徑:C:/protobuf-2.3.0/protobuf-2.3.0/vsprojects/Debug
三、CMD窗口下編譯生成頭文件:
C:/protobuf-2.3.0/protobuf-2.3.0/examples>protoc -I=./ --cpp_out=./ people.proto
將proto文件生成的文件放到當前目錄。
② 編譯protobuf
在編譯osgearth3.5過程中,遇到了鏈接protobuf庫的問題。起初使用了最新版本protobuf-28.0-rc1,通過cmake配置後成功編譯。但在後續編譯中,鏈接protobuf時出現錯誤。懷疑可能是版本問題,嘗試使用較舊版本protobuf-3.4.0,發現cmake配置出現錯誤。將BUILD_TESTS選項取消並勾選BUILD_SHARED_LIBS,解決了鏈接問題,同時添加了zlib依賴。然而,生成的VS工程編譯時仍報錯,追蹤到libprotobuf頭文件hash.h中std::hash_compare未定義。通過添加_SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS宏,解決了此問題。接著遇到了libprotobuf-lite工程編譯問題,發現降級VS版本至VS2013即可解決,但並非預期結果。因此,選擇protobuf-3.6.1版本進行編譯,此版本在cmake配置時遇到與3.4.0類似錯誤,但libprotobuf-lite工程能夠成功編譯。tests工程報錯,但不影響整體編譯,卸載後,通過編譯INSTALL工程實現了安裝。在編譯osgearth時,需在依賴protobuf的工程中添加預定義宏_SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS,否則會報錯。經過重新編譯protobuf-28.0-rc1版本,發現只需將其編譯為動態庫(勾選BUILD_SHARED_LIBS選項)即可滿足osgearth需求。此外,編譯protobuf-28.0-rc1時還需添加abseil-cpp、googletest和jsoncpp庫的源碼,需從各自源碼庫下載並解壓至對應文件夾。總之,明確版本兼容性問題,正確配置cmake選項,是解決此問題的關鍵。