在linux中安裝protobuf編譯器和運行時環境

爲了使用源碼編譯protobuf,須要下面的工具:java

autoconf, automake, libtool, make, g++, unzipc++

若是你使用ubuntu/debian,你可使用以下方式安裝這些工具:git

$ sudo apt-get install autoconf automake libtool curl make g++ unzipgithub

在其餘系統中,請使用對應的包管理工具安裝這些必要的工具。golang

爲了得到源碼,能夠從以下的地址下載一個.tag.gz包或者.zip包,這個取決於本身的喜愛。ubuntu

https://github.com/protocolbuffers/protobuf/releases/latestcurl

若是你只須要C++,下載protobuf-cpp-[version].tar.gz,若是你還須要使用其餘語言,例如java,你能夠只下載protobuf-java-[version].tar.gz(每個包中都已經包含了C++源碼),若是你除了C++,還須要多種語言,下載protobuf-all-[version].tar.gz工具

爲了編譯和安裝C++ Protocal Buffer運行環境和Protocol Buffer編譯器(protoc),執行下面的指令:url

$ ./configure --prefix=... (下面會講解)spa

$ make      # 這個步驟時間可能會很長

$ make check    # 這個步驟時間可能會很長

$ sudo make install

$ sudo ldconfig # refresh shared library cache.

若是」make check」失敗了,你仍然能夠安裝,可是protobuf的有些特徵在你的電腦上不能正確工做。若是你堅持安裝,你就須要考慮這個風險。

編譯proto文件的方法參考下面這條語句:

protoc --cpp_out=. addressbook.proto

註解:

1. 關於安裝位置

若是使用./configure後面不帶-prefix參數,那麼這個包將會安裝到/usr/local。然而,在不少平臺中,/usr/local/lib不是LD_LIBRARY_PATH(用來搜索共享庫)的一部分。你能夠把這個目錄添加成爲LD_LIBRARY_PATH的一部分,你也能夠將protobuf安裝到/usr。爲了實現這個效果,調用./configure的時候,使用以下語句:

./configure --prefix=/usr

若是在一個系統中須要同時使用多個protobuf版本,能夠考慮將protobuf安裝到各自的文件夾中,而後顯示指定LD_LIBRARY_PATH,從而避免衝突。

若是你已經將protobuf構建到一個不一樣的前綴(prefix),先調用」make clean」, 而後再從新構建一次。

2. 編譯依賴包

爲了編譯一個使用protobuf的包,你須要傳入各類參數給編譯器和連接器。2.2.0版本開始,protobuf可使用pkg-config獲得這些參數。若是你已經安裝了pkg-config,你能夠調用以下指令來獲取這些參數:

pkg-config --cflags protobuf # print compiler flags

pkg-config --libs protobuf # print linker flags

pkg-config --cflags --libs protobuf # print both

 

在個人電腦中,

pkg-config --cflags protobuf 輸出 -pthread -I/usr/local/include

pkg-config --libs protobuf 輸出 -L/usr/local/lib -lprotobuf -pthread

 

例如可使用以下方式編譯使用protobufC++代碼:

c++ my_program.cc my_proto.pb.cc `pkg-config --cflags --libs protobuf`

 3. 二進制兼容性警告

因爲C++的特性,兩個protobuf版本的基本不會有兼容的ABIs。若是你使用一箇舊版本的libprotobuf連接程序,這個程序通常不可以使用新版本的動態庫運行。這個問題會在你的程序剛啓動的時候,就被發現。爲了不這種狀況,你也能夠考慮使用靜態連接,方法就是,在編譯時,只安裝靜態庫:

$ ./configure --disable-shared

 

以上只是安裝完成了C++版本的proto的編譯環境,對於其餘語言,須要安裝額外的插件,這裏只講述go語言,由於我使用go語言比較多。

首先記得安裝go的開發環境,這點,我不打算說明。

最簡單安裝go插件的方式是:

go get -u github.com/golang/protobuf/protoc-gen-go

go的插件是protoc-gen-go,調用過上面的指令後,若是$GOBIN沒有被設置,這個插件會被安裝在$GOPATH/bin目錄,若是$GOBIN和$GOPATH都沒有設置,默認應該在~/go/bin目錄。咱們須要將protoc-gen-go所在的目錄添加到$PATH目錄中,不然在調用以下語句時:

protoc -I=. --go_out=. addressbook.proto

會報錯:

protoc-gen-go: program not found or is not executable
--go_out: protoc-gen-go: Plugin failed with status code 1.
若是想要安裝一個特定版本的protoc-gen-go(從而對應proto包的版本),能夠採起的方式以下:

GIT_TAG="v1.2.0" # change as needed

go get -d -u github.com/golang/protobuf/protoc-gen-go

git -C "$(go env GOPATH)"/src/githubcom/golang/protobuf checkout $GIT_TAG

go install github.com/golang/protobuf/protoc-gen-go

相關文章
相關標籤/搜索