在centos6.9下ProtocolBuffers数据传输及存储协议的使用(python)
我们知道Protocol Buffers是Google定义的一种跨语言、跨平台、可扩展的数据传输及存储的协议,因为将字段协议分别放在传输两端,传输数据中只包含数据本身,不需要包含字段说明,所以传输数据量小,解析效率高。感兴趣的可以访问https://developers.google.com/protocol-buffers/docs/overview。Protocol Buffers官方只支持C++, Java, Python, C#, Go, PHP。
检查基础环境
1.检查centos下的软件,如果没有就用yum安装:
autoconf automake libtool curl (used to download gmock) make g++ unzip
ython版本升级
1.检查python版本和对应的pip,因为protobuf官方的例子中python是2.7以上的,而centos 6.9自带的是2.6的,所以需要升级:
cd ~ wget http://python.org/ftp/python/2.7.4/Python-2.7.4.tgz tar -xvf Python-2.7.4.tgz cd Python-2.7.4 ./configure --prefix=/usr/local/python2.7 make check make make install
创建软连接来使系统默认python变为python2.7
mv /usr/bin/python /usr/bin/python.old ln -s /usr/local/python2.7/bin/python2.7 /usr/bin/python python -v
修改yum配置(否则yum可能)
vim /usr/bin/yum 将第一行的#!/usr/bin/python修改为系统原有的python版本地址#!/usr/bin/python2.6
至此CentOS 6.9系统Python已成功升级至2.7.4版本
ython 2.7 下安装pi
1.下载pip安装shell文件
cd ~ wget https://bootstrap.pypa.io/get-pip.py yum install setuptool zlib* -y python get-pip.py
2.创建软连接(否则会报错提示名称不存在)
mv /usr/bin/pip /usr/bin/pip.old ln -s /usr/local/python2.7/bin/pip /usr/bin/pip pip -V
至此pip安装完成!
升级GCC版本(待完善)
centos自动gcc为4.4.7,对于文件protoc编译安装是不能通过的,一次需要升级到4.8.2以上,以支持C++11。
cd ~ wget http://ftp.gnu.org/gnu/gcc/gcc-6.1.0/gcc-6.1.0.tar.gz tar -zvxf gcc-6.1.0.tar.gz --directory=/usr/local/ cd /usr/local/gcc-6.1.0 ./contrib/download_prerequisites mkdir build && cd build ../configure -enable-checking=release -enable-languages=c,c++ -disable-multilib make && make install
可能出现问题:源码编译升级安装了gcc后,编译程序或运行其它程序时,有时会出现类似/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found的问题。这是因为升级gcc时,生成的动态库没有替换老版本gcc的动态库导致的,将gcc最新版本的动态库替换系统中老版本的动态库即可解决。(参考:https://www.linuxidc.com/Linux/2017-10/147621.htm)
1.问题分析:
运行以下命令检查动态库:
strings /usr/lib64/libstdc++.so.6 | grep GLIBC
输出结果如下:
GLIBCXX_3.4 GLIBCXX_3.4.1 GLIBCXX_3.4.2 GLIBCXX_3.4.3 GLIBCXX_3.4.4 GLIBCXX_3.4.5 GLIBCXX_3.4.6 GLIBCXX_3.4.7 GLIBCXX_3.4.8 GLIBCXX_3.4.9 GLIBCXX_3.4.10 GLIBCXX_3.4.11 GLIBCXX_3.4.12 GLIBCXX_3.4.13 GLIBC_2.2.5 GLIBC_2.3 GLIBC_2.4 GLIBC_2.3.2 GLIBCXX_FORCE_NEW GLIBCXX_DEBUG_MESSAGE_LENGTH
从以上输出可以看出,gcc的动态库还是旧版本的。说明出现这些问题,是因为升级gcc时,生成的动态库没有替换老版本gcc的动态库。
2. 问题处理
执行以下命令,查找编译gcc时生成的最新动态库:
find / -name "libstdc++.so*"
输出如下:
/usr/lib/gcc/x86_64-redhat-linux/4.4.4/32/libstdc++.so /usr/lib/gcc/x86_64-redhat-linux/4.4.4/libstdc++.so /usr/lib64/libstdc++.so.6.0.13 /usr/lib64/libstdc++.so.6 /usr/share/gdb/auto-load/usr/lib/libstdc++.so.6.0.13-gdb.pyc /usr/share/gdb/auto-load/usr/lib/libstdc++.so.6.0.13-gdb.pyo /usr/share/gdb/auto-load/usr/lib/libstdc++.so.6.0.13-gdb.py /usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.13-gdb.pyc /usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.13-gdb.pyo /usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.13-gdb.py /usr/local/gcc6.1.0/lib64/libstdc++.so.6.0.22 /usr/local/gcc6.1.0/lib64/libstdc++.so /usr/local/gcc6.1.0/lib64/libstdc++.so.6.0.22-gdb.py /usr/local/gcc6.1.0/lib64/libstdc++.so.6 /opt/gcc-6.1.0/gcc-build-6.1.0/stage1-x86_64-linux/libstdc++-v3/src/.libs/libstdc++.so.6.0.22 //最新动态库 /opt/gcc-6.1.0/gcc-build-6.1.0/stage1-x86_64-linux/libstdc++-v3/src/.libs/libstdc++.so /opt/gcc-6.1.0/gcc-build-6.1.0/stage1-x86_64-linux/libstdc++-v3/src/.libs/libstdc++.so.6 /opt/gcc-6.1.0/gcc-build-6.1.0/prev-x86_64-linux/libstdc++-v3/src/.libs/libstdc++.so.6.0.22 /opt/gcc-6.1.0/gcc-build-6.1.0/prev-x86_64-linux/libstdc++-v3/src/.libs/libstdc++.so /opt/gcc-6.1.0/gcc-build-6.1.0/prev-x86_64-linux/libstdc++-v3/src/.libs/libstdc++.so.6 /opt/gcc-6.1.0/gcc-build-6.1.0/x86_64-linux/libstdc++-v3/src/.libs/libstdc++.so.6.0.22 /opt/gcc-6.1.0/gcc-build-6.1.0/x86_64-linux/libstdc++-v3/src/.libs/libstdc++.so /opt/gcc-6.1.0/gcc-build-6.1.0/x86_64-linux/libstdc++-v3/src/.libs/libstdc++.so.6 ……
/home/gcc-5.2.0/gcc-temp是升级gcc时的输出目录。
将上面的最新动态库libstdc++.so.6.0.21复制到/usr/lib64目录下:
cp /opt/gcc-6.1.0/gcc-build-6.1.0/stage1-x86_64-linux/libstdc++-v3/src/.libs/libstdc++.so.6.0.22 /usr/lib64
复制后,修改系统默认动态库的指向,即:重建默认库的软连接。
切换工作目录至/usr/lib64:
cd /usr/lib64
备份原来软连接:
mv libstdc++.so.6 libstdc++.so.6.old
将默认库的软连接指向最新动态库:
ln -s libstdc++.so.6.0.22 libstdc++.so.6
默认动态库升级完成。重新运行以下命令检查动态库:
strings /usr/lib64/libstdc++.so.6 | grep GLIBC
现在输出如下:
GLIBCXX_3.4 GLIBCXX_3.4.1 GLIBCXX_3.4.2 GLIBCXX_3.4.3 GLIBCXX_3.4.4 GLIBCXX_3.4.5 GLIBCXX_3.4.6 GLIBCXX_3.4.7 GLIBCXX_3.4.8 GLIBCXX_3.4.9 GLIBCXX_3.4.10 GLIBCXX_3.4.11 GLIBCXX_3.4.12 GLIBCXX_3.4.13 GLIBCXX_3.4.14 GLIBCXX_3.4.15 GLIBCXX_3.4.16 GLIBCXX_3.4.17 GLIBCXX_3.4.18 GLIBCXX_3.4.19 GLIBCXX_3.4.20 GLIBCXX_3.4.21 GLIBCXX_3.4.22 GLIBC_2.3 GLIBC_2.2.5 GLIBC_2.3.2 GLIBCXX_FORCE_NEW GLIBCXX_DEBUG_MESSAGE_LENGTH
rotobuf安装
1.安装protoc编译器:
到查找 https://github.com/google/protobuf/releases/ (注意选择版本) cd ~ wget https://github-production-release-asset-2e65be.s3.amazonaws.com/23357588/fba5d776-940f-11e8-88d0-a303c1188d2f?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20190312%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20190312T075947Z&X-Amz-Expires=300&X-Amz-Signature=e57b91ea0140f33e366adf63c67bb597a4a18e8ef96182a0ca98c283008d6710&X-Amz-SignedHeaders=host&actor_id=20057157&response-content-disposition=attachment%3B%20filename%3Dprotobuf-all-3.6.1.tar.gz&response-content-type=application%2Foctet-stream tar -xvf protobuf-all-3.6.1.tar.gz cd protibuf-3.6.1 # 指定安装路径 ./configure --prefix=/usr/local/protobuf # 测试,这一步很耗时间 make check make && make install
如何编译不通过,需要升级gcc到新版,同时升级so库,可以参考:https://www.linuxidc.com/Linux/2017-10/147621.htm
查看版本:
/usr/local/bin/protoc --version libprotoc 3.6.1
继续安装protobuf的python模块(如果不用python,可跳过这一步)
cd ./python python setup.py build python setup.py test python setup.py install
- 上一篇:如何在CentOS6.5上升级PHP
- 下一篇:CentOS7export命令