当前位置:   article > 正文

linux环境下protobuf的安装与使用_linux 使用proto

linux 使用proto

零、最快捷的方式pip安装

(1)如下pip安装protobuf并指定版本

  1. sudo yum install pip #安装pip
  2. pip install protobuf==2.5.0 #pip安装并指定protobuf的版本;不行的话实时其他版本。
  3. sudo pip install --upgrade protobuf #更新protobuf版本
  4. pip install gevent==1.4.0 #pip安装gevent并指定版本
  5. pip install -i https://pypi.douban.com/simple/ locustio==0.11.0 #pip安装locust并制定版本

 同时有python2和python3时使用pip的方法。

python2:

python2 -m pip install XXX

python3:

python3 -m pip install XXX

注:这个安装的时候可能要稍微注意下是python2还是python3安装的。如下是python3安装的。

 然后我们在python3下执行 "import google.protobuf" 就是ok的。

 在python2下执行就是不ok的。

然后自己的python脚本也注意下引的是哪个。“#!/usr/bin/python3” or “#!/usr/bin/python”

注:pip方式安装的可能会缺少一个一些包,因此还是建议官网源码下载安装。

一、protoc的安装使用

protoc就是是protobuf的编译器,它可以把proto文件编译成不同的语言。

猜测全称应该是 proto compiler。

1、默认protoc的安装

(1)protobuf的下载这里(next可找到更早版本)。此处下载的是protobuf-all-3.5.1.tar.gz。

(2)安装准备安装protobuf前确保以下软件都已经被安装。方法也很简单yum -y install XXXX即可。

  1. #下面这些可能都是需要是事先安装的(如果后续安装出错往这里想想)
  2. autoconf
  3. automake
  4. libtool
  5. make
  6. g++
  7. unzip

注1:可能会遇到一个蛋疼的问题。那就是执行make提示你要“yum install make”安装;指令安装语句又提示你“already install”,特别的蛋疼(见下图)。

解决办法:remove后重新安装即可。

  1. #查看rpm是否安装
  2. rpm -qa | grep "make"
  3. #通过yum卸载
  4. yum remove make
  5. #然后重新安装
  6. yum install make -y

  

注2:值得注意的是我们要将g++设为默认使用C++11,可以在终端执行:

alias g++='g++ -std=c++11'

但是切记:这个只是临时生效的,永久有效的方法是将上述语句写入/root/.bashrc 文件中。

  1. vim /root/.bashrc
  2. 添加:alias g++='g++ -std=c++11'

(3)安装protobuf

执行如下命令,安装时间有点长,耐心等待(可以写成自动化脚本,就无需一步一步执行):

  1. ./configure
  2. make #时间有点长
  3. make check #时间有点长
  4. sudo make install
  5. sudo ldconfig # refresh shared library cache.

这时一般来说
libprotobuf库在/usr/local/lib路径下;protoc一般在/usr/local/bin路径下 。如下:

(4)配置环境变量

主要是完善PATH和PKG_CONFIG_PATH等环境变量

$ sudo vim /etc/profile

添加

  1. export PATH=$PATH:/usr/local/bin/
  2. export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/ #这个参数是必须的
  3. #我添加了这些,感觉有些没有也可以。
  4. export PATH=$PATH:/usr/local/bin
  5. export PATH=$PATH:/usr/local/include
  6. export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
  7. export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

保存生效

source /etc/profile

注:(1)保存生效的语句需要在每个终端都执行一遍才可以生效;

(2)通过echo $PATH   /  echo $PKG_CONFIG_PATH的方法验证配置在本终端有没有生效。

(3)上述配置中PKG_CONFIG_PATH是必须的(当然其他可能也是必须的),如果没有在编译的时候会报如下错误:

这里的protobuf.pc存了protobuf相关的头文件和库相关的信息,这些信息都是编译的时候要用到的。这里是因为我们使用了pkg-config来方便引用了的,关于pkg-config参见 这里

(5)配置动态路径

sudo vim /etc/ld.so.conf

追加

/usr/local/lib

然后以root权限更新动态库路径

ldconfig

(6)验证有没有安装成功

执行:

protoc --version

能够显示相应版本信息就说明安装成功。

(7)继续安装python版protobuf的话继续指令如下指令即可:

  1. #到protobuf解压包的python目录下
  2. cd ./python
  3. #依次执行如下语句
  4. python setup.py build
  5. python setup.py test
  6. python setup.py install

之后python脚本导入编译后的pb文件后就不会出现“ImportError: No module named google.protobuf.internal”报错了。

另外:使用python脚本的时候还可能会遇到,如下报错。

Traceback (most recent call last):
  File "./200320.py", line 4, in <module>
    import com.tencent.epc.innerprocess_pb2 as innerprocess
  File "/data/home/shuozhuo/myInner/com/tencent/epc/innerprocess_pb2.py", line 7, in <module>
    from google.protobuf import descriptor as _descriptor
  File "/usr/lib/python2.7/site-packages/google/protobuf/descriptor.py", line 117
    class DescriptorBase(metaclass=DescriptorMetaclass):
                                  ^
SyntaxError: invalid syntax

解决方法如下:

  1. #看起来是版本不匹配!!
  2. pip install protobuf==3.17.3

https://blog.csdn.net/qq_40837542/article/details/121549356 
https://www.cnblogs.com/Primzahl/p/16392682.html 
 

2、安装非内置语言插件

(1)protoc非内置的语言支持需要自己安装语言插件。

比对 --go_out= 对应的就是 protoc-gen-go。 

#指定helper可以看到其默认支持的语言插件。

#可以看到包含了常用的C++、python,但是并没有golang。主要是因为golang、dart语言是由google维护,通过protoc的插件机制来实现,所以仓库单独维护了。

protoc --help

(2)安装golang插件protoc-gen-go

# 最新版
$ go install google.golang.org/protobuf/cmd/protoc-gen-go@latest

# 指定版本
$ go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.3.0

一个完整的编译语句如下:

  1. protoc --proto_path=src --go_out=out --go_opt=paths=source_relative foo.proto bar/baz.proto
  2. #本地编译直接这样就好了
  3. protoc msg_record.proto --go_out=./

注意事项:protoc-gen-go要求pb文件必须指定go包的路径,即:

option go_package = "protojson/msg_record";

(3)使用举例

1)首先,创建msg_record.proto文件,内容如下:

  1. syntax = "proto3";
  2. //package msg_record;
  3. option go_package = "protojson/msg_record";
  4. message TrackRsp{
  5. uint32 code = 1[json_name = "code"];
  6. string msg = 2[json_name = "msg"];
  7. Data data = 3[json_name = "data"];
  8. }
  9. message Data{
  10. repeated Record records = 1[json_name = "records"];
  11. uint32 count = 2[json_name = "count"];
  12. string pen = 3[json_name = "pen"];
  13. }
  14. message Record {
  15. uint64 time = 1[json_name = "time"];
  16. repeated MsgContent msg = 2[json_name = "msg"];
  17. string name = 3[json_name = "name"];
  18. uint32 receptor = 4[json_name = "receopor"];
  19. uint32 seqno = 5[json_name = "seqno"];
  20. uint32 msg_direction = 6[json_name = "msg_direction"];
  21. uint32 is_recall = 7[json_name = "is_recall"];
  22. uint32 is_graybar = 8[json_name = "is_graybar"];
  23. GraybarInfo graybar_info = 9[json_name = "
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/1008961
推荐阅读
相关标签
  

闽ICP备14008679号