Ubuntu 16.04 升级安装 protobuf 3.6+

 

Ubuntu16.04系统自带的protobuf版本为 2.6.1 

通过 locate 可以看到 /usr/lib/x86_64-linux-gnu/ 路径下面 会有 libprotobuf-lite.so.9 libprotobuf-lite.so.9.0.1

 libprotobuf.so.9  libprotobuf.so.9.0.1等so文件,其中 libprotobuf-lite.so.9 和 libprotobuf.so.9 是文件链接。

这两个包主要是通过 sudo apt install  libprotobuf-lite9v5 和 sudo apt install  libprotobuf9v5来安装的(注意不是libprotobuf-dev 这个包安装时仅会安装头文件和一个 libprotobuf.so 的空链接)

按照protobuf的官方的说明编译并安装protobuf3.6.1

运行:

$ ./autogen.sh
$ ./configure --prefix=/usr  (--prefix指定来安装目录到/usr/lib。然后进行编译和安装,缺省会安装/usr/local/lib,但是有些ubuntu系统默认不能ld这路径,需要去配置)
$  make
$ make check
$ sudo make install 
$ sudo ldconfig # refresh shared library cache.

安装完成后在 /usr/lib/ 路径下面就有  libprotobuf-lite.so.17  libprotobuf-lite.so.17.0.0 libprotobuf.so   libprotobuf.so.17   libprotobuf.so.17.0.0 等文件

问题总结

 【问题1】: 在./configure 时用 --prefix 这个参数乱尝试,结果在很多路径上都安装了文件,怎么卸载make install安装的库文件。

     这可以通过 sudo make uninstall 来卸载。如果安装了很多位置,可以先运行./configure  --prefix= 指定某个路径 然后uninstall,  反复多次就都卸载掉了。

【问题2】: 用protobuff3.6.1库开发的应用程序,在运行时会提示冲突,也即是ld调用了 libprotobuf.so.9,而不是 libprotobuf.so.17。

  其实应用程序应该去访问libprotobuf.so这个链接。而我之前不小心装了libprotobuf-dev 结果 /usr/lib/x86_64-linux-gnu/ 路径下面就多了libprotobuf.so 这个软链接,会连接到libprotobuf.so.9。应该卸载掉libprotobuf-dev。

【错误1】: 开始没经验,想了一个方案:先卸载系统自带的所有libprotobuf库。然后编译安装新版的库,这样机器上就可以只保留一个版本,多好啊。

于是,痛苦的经历就来了。


首选,我通过 apt-get remove  命令来尝试卸载 libprotobuf-lite9v5和  libprotobuf-dev  这两个包(其实应该还有一个包libprotobuf9v5我当时还不知道),但是总是失败,我也没有仔细看,就误以为是因为 make install protobuf3.6.1 扰乱了系统对 libprotobuf的安装维护信息。此时我还不知道卸载的方法,系统里好多路径都有这个库。我还曾经 用prefix=/usr/lib/x86_64-linux-gnu进行了一次编译安装,安装后发现,libprotobuf-lite.so.17 libprotobuf.so.17等一众文件最终还是装到了/usr/lib/ 这个路径下,尽管在生成的Makefile里找到有这个信息 prefix=/usr/lib/x86_64-linux-gnu。 (怀疑x86_64-linux-gnu是被系统保护或过滤掉了)。

 于是,我作出了一个非常错误的决定,那就是手动删掉 /usr/lib/x86_64-linux-gnu/ 路径下面的 libprotobuf*,然后编译安装新版 。 结果系统重启后就无法进入桌面了。在完成grub之后就黑屏了,提示错误如下:

lvmetad is not active yet; using direct activation during sysinit

/dev/mapper/server--vg-root: clean xxx/xxx files, xxx/xxx blocks

这个问题的根本原因就是 libprotobuf-lite.so.9 被删掉了,而系统的桌面程序强依赖这个库,这也就是之前卸载不掉的原因。

在这个黑屏状态下 ALT+CTRL + F1 也无法进入utty 终端,这是因为系统还没有启动。 最后,我只能通过在grub界面下面选择 advance ubuntu启动,然后选择恢复模式 (recover mode )。这个模式下面有很多好用的选项,我基本上都尝试了一遍,比如:

  • clean ,Try to make free space。(这命令执行完也没有看到什么效果)
  • root,root drop to a root shell prompt ( 这个就是进入 root 的终端,可以修改系统配置,但是却不能联网,要想联网需要先执行下面network这个选项启动网络,成功返回后再选择进入root终端)
  • network Enable networking 这个命令可以启动网络。
  • grub update grub bootloader 实际上问题不在grub,更新了一下grub也没效果。
  • dpkg Repair broken packages : 这个命令还是很有用的,此时我尝试用它来修复却失败了,然后我进入root终端用apt-get 的一些常规手段去修复和清理结果都失败了,错误提示竟然是找不到libprotobuf-lite.so.9。 原来如此,于是sudo apt install  libprotobuf-lite9v5。 重启计算机后总算是可以启动系统,但是进入系统后桌面却不正常,只能看到桌布的壁纸和上面的一些文件,桌面的上面的系统菜单、状态栏,左边的程序坞也没了。 ALT+CTRL + T 也无法启动终端,好在可以通过鼠标右键桌布来启动终端,也能进入utty终端,也能启动synaptic。 

开始以为是桌面系统坏掉了,于是重装了桌面,甚至重装的虚拟机的tools工具包,重装了libprotobuf-dev(此时我还不知道这个库竟然只是个空链接)都不行。最后问题聚焦到启动 unity 上来,运行 sudo unity —reset 这个命令后提示:

/usr/lib/x86_64-linux-gnu/unity/compiz-config-profile-setter: error while loading shared libraries: libprotobuf.so.9: cannot open shared object file: No such file or directory

compiz (core) - Error: Failed to load plugin: ccp

这是因为有一个plugin无法load。我查到了一篇文章上面说到: unity 桌面的插件管理主要是靠 compiz 和 compizconfig-settings-manager 来进行配置。另外就是可以用ccsm 命令来启用unity插件(参见:ubuntu 无法显示菜单栏和状态栏  http://www.cnblogs.com/xu-neal/p/3852355.html)

我试了compizconfig-settings-manager 也是没有什么效果,但是当我运行运行 ccsm的时候会提示错误:

import compizconfig

ImportError: libprotobuf.so.9: cannot open shared object file: No such file or directory

于是通过 ldd /usr/lib/x86_64-linux-gnu/libcompizconfig.so.0 发现 libprotobuf.so.9 => not found。这就说明unity 无法load的插件就是它:libcompizconfig.so.0。 按照常理:libprotobuf.so.9 就是应该包含在 libprotobuf-dev这个包里面,问题是我已经通过apt-get  卸载并重新安装过这个包了。于是到/usr/lib/x86_64-linux-gnu下面去找,果然没有。   

但是我不想在安装这个低版本的包了,否则就又回到了问题的起点, 我想自行编译这个libcompizconfig.so.0 让他直接依赖新版protobuf库,最后系统就只保留 libprotobuf-lite.so.9和 libprotobuf-lite.so.17就可以了。

于是我去下载了https://github.com/compiz-reloaded/libcompizconfig ,编译时总是报错,最后发现这个版本太老了是0.8.16。系统依赖的版本是0.9.12.3。

最后找到了真正的地址https://git.launchpad.net/compiz/,libcompizconfig其实是compiz_0.9.12.3代码里面的一个子模块,需要编译compiz才行。 但是编译compiz却比想象中困难,依赖了很多库,装了半天最后卡在了kdebase-workspace这个上面,最后就放弃了。

 

终极总结

1、最终,还是接受新旧两个版本并存这个不完美的方案吧。系统访问的是libprotobuf-lite.so.9 和 libprotobuf.so.9,我们让应用程序去访问的libprotobuf.so这个链接,只要不安装libprotobuf-dev就可以避免冲突。

2、以前还尝试通过添加新的ubuntu安装源来直接安装新版的libprotobuf3.6.1版。但是这些源并不是ubuntu的稳定源,虽然能安装成功,但是相关依赖也会跟着升级,很容易把系统弄崩溃,非常不建议这么做。正如本文遇到的情况,系统的桌面和渲染都依赖libprotobuf的低级版本,如果升级覆盖掉这些库,很可能造成对运行环境的破坏。

你可能感兴趣的:(linux,脚本)