protobuf如何用proto文件導出C++代碼文件及鏈接protobuf靜態庫問題


【一】.如何用.proto文件導出C++代碼

之前把protobuf編好了,迫不及待寫個小程序試一下

當protobuf編譯安裝完成後,就可以在命令行下任何目錄輸入命令:

  1. 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:

  1. protoc xxxx.proto --cpp_out=.  

2.最好是cd到proto文件所在的目錄再導出,否則會出現生成出來的文件找不到頭文件的問題

protobuf生成C++代碼時會在同一個目錄下生成兩個文件,一個.cc一個.h,生成的.cpp文件會include生成的.h文件,而如果不cd到proto文件所在目錄去操作,那就可能會出現.cc文件包含.h文件時路徑錯誤

例如:.proto文件在src目錄下,導出代碼也導出到src目錄下,可能執行如下命令

  1. protoc src/xxxx.proto --cpp_out=.  
不出所料,src目錄下確實出現了生成的.cc和.h文件,但是一編譯,就會報錯了

原因是找不到頭文件"src/xxxx.pb.h",原來,protobuf把執行命令時proto文件所在目錄的路徑也加到生成的代碼中了。

所以要想避免這個問題,就cd到protobuf所在的目錄再去操作。例如上例的解決辦法就是

cd src

  1. 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


ubuntu下編譯protobuf

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 包含內容:

  1. /usr/local/lib  
2>. 輸入命令
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了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章