在編譯chromium代碼的過程中發現,官方推薦使用的版本是ubuntu16.04,但是這個版本的ubuntu比較老舊,一些庫都比較老了,但是google自己用的部分卻是挺新的,protobuf就是一個例子,在ubuntu16.04上默認安裝的protobuf的版本是2.6.1,但是chromium在執行的時候用的是自己代碼編譯出的protobuf庫,版本是3.5.1就會報錯,提示你版本不兼容,比較坑的是,這個東西是在執行二進制文件的時候報錯的,就是需要會重新編譯。同時需要安裝新版本的protobuf
,報錯如下所示
[libprotobuf FATAL ../../third_party/protobuf/src/google/protobuf/stubs/common.cc:79] This program was compiled against version 2.6.1 of the Protocol Buffer runtime library, which is not compatible with the installed version (3.5.1). Contact the program author for an update. If you compiled the program yourself, make sure that your headers are from the same version of Protocol Buffers as your link-time library. (Version verification failed in "/build/mir-O8_xaj/mir-0.26.3+16.04.20170605/obj-x86_64-linux-gnu/src/protobuf/mir_protobuf.pb.cc".)
Aborted (core dumped)
卸載原來的protobuf
如果原來有則需要卸載,可以通過protoc --version
查看當前版本,版本不對可以卸載
$ sudo apt remove libprotobuf-dev #這個不確定是否需要卸載
$ sudo apt remove protobuf-compiler
安裝protobuf
在ubuntu16.04上安裝protobuf
要先確定一點,你要安裝的版本的是多少,在這個網址https://github.com/protocolbuffers/protobuf/tags下載你所需要的包,語言也需要搞清楚,例如我用於C++編譯的3.5.1版本的包,下載protobuf-cpp-3.5.1.tar.gz
就好了。(其他語言就下其他版本的,如果全都要可以下all的)
下好之后解壓,進入解壓后的目錄,准備開始安裝
需要注意的一點是這個protobuf默認安裝在/usr/local,在一些平台上/usr/local/lib默認不是LD_LIBRARY_PATH,你可以手動添加,但是如果把安裝目錄指定在/usr會更簡單省事兒。
那么怎么指定呢?下面是默認安裝命令,但是先別急着執行
$ ./autogen.sh
$ ./configure
$ make
$ make check
$ sudo make install
$ sudo ldconfig # refresh shared library cache.
修改默認安裝路徑
/usr/local不是LD_LIBRARY_PATH,但是/usr是啊,改下默認安裝路徑,在執行第二步的時候指定
$ ./configure --prefix=/usr
沒有指定怎么辦
如果沒有指定有可能會出現找不到庫的情況可以通過protoc --version
查看,找不到庫會報錯,如果能找到就會顯示安裝的版本
手動添加到/etc/profile中
$ sudo vim /etc/profile
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/
export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/lib/
export PATH=$PATH:/usr/local/bin/
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/local/include/
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/local/include/
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/
然后重啟,查看版本驗證即可
后續
后來發現報錯不是因為系統庫版本過低,而是系統使用的這個文件的頭部顯示mir_protobuf.pb.cc
這個文件是由2.6.1的protobuf-compiler
編譯得來的,這就說明無法通過安裝更高版本的庫來解決這個問題,因為這個文件是系統已經有的,不能通過重新安裝新庫來解決這個問題。通過提升系統版本的方式解決這個問題比較穩妥。