【一】.如何用.proto文件導出C++代碼
之前把protobuf編好了,迫不及待寫個小程序試一下
當protobuf編譯安裝完成後,就可以在命令行下任何目錄輸入命令:
- protoc proto文件路徑 --cpp_out=C++代碼文件導出目錄
在使用中我發現有一點需要注意,就是--cpp_out的目錄是根據proto文件的路徑爲基礎的,也就是說:假設proto文件位於src目錄下,希望將C++代碼也導出到src目錄下,那麼--cpp_out直接=.就可以了。不需要再寫一遍src/,如果寫了src/,那麼代碼導出的目錄將是src/src/(即使src/src不存在,也會被創建)
注意:
1.proto文件路徑要有文件名,而--cpp_out路徑不能有文件名,只能是路徑
例如,.proto當前目錄下,想把C++代碼也生成到當前目錄下,應該如下調用protoc:
- protoc xxxx.proto --cpp_out=.
2.最好是cd到proto文件所在的目錄再導出,否則會出現生成出來的文件找不到頭文件的問題
protobuf生成C++代碼時會在同一個目錄下生成兩個文件,一個.cc一個.h,生成的.cpp文件會include生成的.h文件,而如果不cd到proto文件所在目錄去操作,那就可能會出現.cc文件包含.h文件時路徑錯誤
例如:.proto文件在src目錄下,導出代碼也導出到src目錄下,可能執行如下命令
- protoc src/xxxx.proto --cpp_out=.
原因是找不到頭文件"src/xxxx.pb.h",原來,protobuf把執行命令時proto文件所在目錄的路徑也加到生成的代碼中了。
所以要想避免這個問題,就cd到protobuf所在的目錄再去操作。例如上例的解決辦法就是
cd src
- protoc xxxx.proto --cpp_out=.
【二】.鏈接protobuf的靜態庫
如果只將protoc生成的代碼頭文件和代碼文件加入工程,在鏈接階段會報錯,錯誤內容大致就是未定義的方法XXXXX云云,一看就是沒有包含protobuf的靜態庫,但我在protobuf的目錄下找了半天也沒找到靜態庫在生成到哪了。
後來突然想到在之前的一篇文章中說到過protobuf是將lib安裝到/usr/local/lib下了,而這個目錄應該是默認包含目錄之一(不一定是,取決於OS及版本),所以不需要設置鏈接路徑,只需直接在Makefile/CMakeLists.txt中鏈接庫“protobuf”即可編譯通過。如果問題依舊,那可能是/usr/local/lib沒有被加入到默認的包含環境,解決方法在這篇文章也有講到
原文連接 : http://blog.csdn.net/xocoder/article/details/9173947
1.下載protobuf
下載地址:http://code.google.com/p/protobuf/downloads/list
2.編譯protobuf
解壓下載的zip包,cd到protobuf的目錄下,執行以下指令:
./configure
make
make check
make install
3.檢查安裝是否成功
protoc --version
如果成功,則會輸出版本號信息,例如:libprotoc 2.5.0
如果有問題,則會輸出錯誤內容。
4.錯誤及解決方法
protoc: error while loading shared libraries: libprotoc.so.8: cannot open shared
錯誤原因:
protobuf的默認安裝路徑是/usr/local/lib,而/usr/local/lib 不在Ubuntu體系默認的 LD_LIBRARY_PATH 裏,所以就找不到該lib
解決方法:
方法1. 加入到文件中/etc/ld.so.conf
1>. 創建文件 /etc/ld.so.conf.d/libprotobuf.conf 包含內容:
- /usr/local/lib
sudo ldconfig
方法2 : 把當前路徑加入環境變量LD_LIBRARY_PATH中
export LD_LIBRARY_PATH=YOU_PATH:$LD_LIBRARY_PATH
[YOU_PATH : 表示你的動態庫路徑]
這時,再運行protoc --version 就可以正常看到版本號了
原文連接2 : http://blog.csdn.net/xocoder/article/details/9155901
另外, 如果出現未定函數或者重複定義之類的錯誤, 就要注意生成protobuf工具的版本問題, 不同版本之間會有不同的函數原型調用, 只需要保證在makefile中鏈接的庫, 與編譯.proto文件的庫是同一個庫就ok了