下載protobuf-2.3.0:
http://protobuf.googlecode.com/files/protobuf-2.3.0.zip
http://code.google.com/p/protobuf/downloads/list
安裝:
unzip protobuf-2.3.0.zip
cd protobuf-2.3.0
./configure
make
make check
make install
1.每步在執行過程中注意權限問題,有的命令不sudo執行會出問題。
./configure
make
make check
make install
2. 執行./configure 出現error,查看config.log文件看看是否缺某些安裝軟件,比如g++未安裝等,因為執行文件中含有C++程序,所以出問題。
3.動靜態庫問題部分是轉載
在Linux上編譯google protobuff時,configure 默認選項是生成動態庫,即libprotobuf.so文件。如果同時在多個動態庫(動態庫以dlopen方式動態加載)中使用同一buff結構,則運行時會報錯誤:
ibprotobuf ERROR google/protobuf/descriptor_database.cc:57] File already exists in database: foo/foo.proto libprotobuf FATAL google/protobuf/descriptor.cc:862] CHECK failed: generated_database_->Add(encoded_file_descriptor, size): terminate called after throwing an instance of 'google::protobuf::FatalException' what(): CHECK failed: generated_database_->Add(encoded_file_descriptor, size):為了解決這個問題,google protobuff,則不能以動態庫的形式調用,改用靜態庫的形式在編譯時加載。
configrue --disable-shared
即可編譯成靜態庫:libprotobuf.a 但是默認的configure文件中,在編譯時未加-fPIC ,導致在引用靜態庫的工程中編譯鏈接時報錯誤:
libs/assert.o: relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC .libs/assert.o: could not read symbols: Bad value
解決該問題,需要重新編譯google protobuff庫,並添加編譯選項:-fPIC
以文本形式打開google buff代碼目錄下的configure文件,在把第2575至2578行修改為如下:
if test "x${ac_cv_env_CFLAGS_set}" = "x"; then : CFLAGS="-fPIC" fi if test "x${ac_cv_env_CXXFLAGS_set}" = "x"; then : CXXFLAGS="-fPIC"
需要注意的是不同版本的configure文件不同,所以源代碼的行數也不同,2.3.0是1962行開始,貼出被替換代碼,以便於替換
if test "x${ac_cv_env_CFLAGS_set}" = "x"; then
CFLAGS=""
fi
if test "x${ac_cv_env_CXXFLAGS_set}" = "x"; then
CXXFLAGS=""
fi
替換時注意if 和fi 的配對使用,否則執行不了,會出現語法錯誤,文件無法正常結束。
4.在修改文件后編譯要重新編譯,首先進行make clean ,否則不會重新執行。
5.最后修改環境變量,建議修改本用戶的環境變量,~/.bashrc,不修改etc下環境變量
# append protobuf to PATH/lys
export PROTOBUF_HOME=/usr/local/protobuf/protobuf-2.3.0
export PATH=$PROTOBUF_HOME/bin:$PATH
HOME目錄由安裝目錄而定,各不相同。
6.測試是否安裝成功,protoc --version,顯示出版本則說明安裝成功