linux环境下protobuf的安装与使用

零、最快捷的方式pip安装

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

sudo yum install pip  #安装pip
pip install protobuf==2.5.0   #pip安装并指定protobuf的版本;不行的话实时其他版本。
sudo pip install --upgrade protobuf #更新protobuf版本
pip install gevent==1.4.0 #pip安装gevent并指定版本
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即可。

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

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

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

#查看rpm是否安装
rpm -qa | grep "make"

#通过yum卸载
yum remove make

#然后重新安装
yum install make -y

  

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

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

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

vim /root/.bashrc

添加:alias g++='g++ -std=c++11'

(3)安装protobuf

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

./configure 
make  #时间有点长
make check  #时间有点长
sudo make install 
sudo ldconfig  # refresh shared library cache.

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

(4)配置环境变量

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

$ sudo vim /etc/profile

添加

export PATH=$PATH:/usr/local/bin/
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/  #这个参数是必须的

#我添加了这些,感觉有些没有也可以。
export PATH=$PATH:/usr/local/bin
export PATH=$PATH:/usr/local/include
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
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的话继续指令如下指令即可:

#到protobuf解压包的python目录下
cd ./python
#依次执行如下语句
python setup.py build
python setup.py test
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

解决方法如下:

#看起来是版本不匹配!!
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

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

protoc --proto_path=src --go_out=out --go_opt=paths=source_relative foo.proto bar/baz.proto


#本地编译直接这样就好了
protoc msg_record.proto --go_out=./

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

option go_package = "protojson/msg_record";

(3)使用举例

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

syntax = "proto3";

//package msg_record;
option go_package = "protojson/msg_record";

message TrackRsp{
    uint32 code        = 1[json_name = "code"];
    string msg         = 2[json_name = "msg"];
    Data   data        = 3[json_name = "data"];
}


message Data{
    repeated Record records  = 1[json_name = "records"];
    uint32   count       = 2[json_name = "count"];
    string   pen         = 3[json_name = "pen"];
}


message Record {
    uint64 time              = 1[json_name = "time"];
    repeated MsgContent msg  = 2[json_name = "msg"];
    string name              = 3[json_name = "name"];
    uint32 receptor          = 4[json_name = "receopor"];
    uint32 seqno             = 5[json_name = "seqno"];
    uint32 msg_direction     = 6[json_name = "msg_direction"];
    uint32 is_recall         = 7[json_name = "is_recall"];
    uint32 is_graybar        = 8[json_name = "is_graybar"];
    GraybarInfo graybar_info &#
  • 7
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Linux环境使用Protobuf的步骤如下: 1. 首先,确保你已经安装libprotobuf库和protoc编译器。一般来说,libprotobuf库位于/usr/local/lib路径下,而protoc一般位于/usr/local/bin路径下。 2. 在你的代码中,引入所需的头文件,例如#include "testproto.pb.h"。然后,根据你的需求使用Protobuf的报文。你可以根据自己的需求创建和操作Protobuf的对象。 3. 在编译程序之前,确保你已经设置了正确的编译选项和路径。为了正确地编译程序,你需要指定正确的头文件路径和库文件路径。例如,你可以使用以下命令编译程序: ```bash g++ -g -I/usr/local/ -I/usr/local/protobuf/ -I/usr/local/bin/ -I/usr/local/protobuf/include/google/protobuf/ -I/usr/local/protobuf/include/ -std=c++11 -MMD -MP -MF -lprotobuf -pthread -o testproto testproto.pb.o testproto.pb.cc ``` 4. 在运行程序之前,确保你已经设置了LD_LIBRARY_PATH环境变量,将libprotobuf库的路径添加到其中。你可以使用以下命令设置LD_LIBRARY_PATH环境变量: ```bash export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib ``` 5. 如果你需要在命令行中直接运行protoc编译器,你可以将protoc所在目录添加到PATH环境变量中,并将libprotobuf的pkgconfig目录添加到PKG_CONFIG_PATH环境变量中。例如,你可以使用以下命令添加PATH和PKG_CONFIG_PATH环境变量: ```bash export PATH=$PATH:/usr/local/protobuf/bin/ export PKG_CONFIG_PATH=/usr/local/protobuf/lib/pkgconfig/ ``` 通过以上步骤,你就可以在Linux环境下成功使用Protobuf了。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

焱齿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值