Google Protocol Buffers自带c++,java,python例子程序编译运行

本文主要是介绍Google Protocol Buffers自带c++,java,python例子程序编译运行,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在我的前一篇文章《Protocol Buffers的安装使用和C++/Python入门示例》中提到google protocol buffers自带了examples,里面有c++,java,python的例子。初学者在编译的过程中经常会遇到环境变量和jar包找不到的问题。这里,我将我的编译过程详细记录在这里,避免大家走弯路。

1. 准备工作

首先,当然是编译和安装好protobuf,参照《Protocol Buffers的安装使用和C++/Python入门示例》一文即可。

我电脑上的protobuf目录是protobuf-2.3.0.tar.gz 解压后在  /home/admin/work/protobuf-2.3.0/

编译后安装在  /home/admin/work/protobuf-2.3.0/proto,  在proto目录下有bin,include,lib三个目录

2. 编译c++例子

在examples目录下运行 make 会编译c++,java,python的例子,但是没有设置环境变量的话,会有很多错误:

1 [admin@search001 examples]$ make
2 protoc --cpp_out=. --java_out=. --python_out=. addressbook.proto
3 pkg-config --cflags protobuf  # fails if protobuf is not installed
4 Package protobuf was not found in the pkg-config search path.
5 Perhaps you should add the directory containing `protobuf.pc'
6 to the PKG_CONFIG_PATH environment variable
7 No package 'protobuf' found
8 make: *** [add_person_cpp] Error 1

这个是因为Makefile中会用pkg-config命令检测环境变量,但是没有设置PKG_CONFIG_PATH,找不到protobuf.pc这个文件

1 export PKG_CONFIG_PATH=/home/admin/work/protobuf-2.3.0/proto/lib/pkgconfig/

再执行  make cpp 单独编译c++,编译好后会生成两个可执行文件add_person_cpp 和 list_people_cpp,运行即可。

3. 编译java例子

直接执行 make java 会出现一大堆的找不到包的错误:

1 [admin@search001 examples]$ make java
2 javac AddPerson.java ListPeople.java com/example/tutorial/AddressBookProtos.java                                                                            
3 com/example/tutorial/AddressBookProtos.java:12: package com.google.protobuf does not exist
4       com.google.protobuf.GeneratedMessage {                                                                                                                
5                          ^
6 com/example/tutorial/AddressBookProtos.java:9: package com.google.protobuf does not exist                                                                   
7       com.google.protobuf.ExtensionRegistry registry) {
8                          ^                                                                                                                                  
9 com/example/tutorial/AddressBookProtos.java:1210: package com.google.protobuf.Descriptors does not exist
10   private static com.google.protobuf.Descriptors.Descriptor

需要自己编译protobuf的jar包了,要先安装好maven才能编译哦

1 cd  /home/admin/work/protobuf-2.3.0/java
2 mvn package

最终会生成一个jar包 /home/admin/work/protobuf-2.3.0/java/target/protobuf-java-2.3.0.jar

如果没有maven,可以到网上下载这个包。

设置java classpath:

1 export CLASSPATH=/home/admin/work/protobuf-2.3.0/java/target/protobuf-java-2.3.0.jar:$CLASSPATH

执行make java,就会生成add_person_java和list_people_java两个可执行脚本。脚本内容如下:

1 [admin@search001 examples]$ cat add_person_java
2 #! /bin/sh
3 java -classpath .:$CLASSPATH AddPerson "$@"
4 [admin@search001 examples]$ cat list_people_java
5 #! /bin/sh
6 java -classpath .:$CLASSPATH ListPeople "$@"

如果在编译的时候出现如下的错误:

1 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile (default-compile) on project proto: Compilation failure: Compilation failure:
2 [ERROR] ... is not abstract and does not override abstract method newBuilderForType(com.google.protobuf.GeneratedMessage.BuilderParent)in com.google.protobuf.GeneratedMessage
3 [ERROR] ... is not abstract and does not override abstract method internalGetFieldAccessorTable() incom.google.protobuf.GeneratedMessage.Builder

原因是protobuf的版本不对,需要用最新的版本,如 2.4.1

4. 编译python例子

发现编译能成功,但是运行的时候提示找不到相关模块

1 [admin@search001 examples]$ makepython                                                                                                                       
2 protoc --cpp_out=. --java_out=. --python_out=. addressbook.proto
3 Writing shortcut script add_person_python...                                                                                                                
4 Writing shortcut script list_people_python...
5 [admin@search001 examples]$ ./add_person_python                                                                                                               
6 Traceback (most recent call last):
7   File "./add_person.py", line 5, in?                                                                                                                      
8     import addressbook_pb2
9   File "/home/admin/work/protobuf-2.3.0/examples/addressbook_pb2.py", line 3, in?                                                                                      
10     from google.protobuf import descriptor
11 ImportError: No module named google.protobuf

需要安装python类库, protobuf-2.3.0-py2.6.egg文件类似于c++中的.so或者是java中的jar文件,是一个库文件,提供调用,安装egg文件最简单的方法是安装easy_install,如果你不想安也可以,指定egg文件的路径,但是这样做会有些风险,因为加载egg文件还需要一个python的库setuptools-0.6c9-py2.5.egg。

1 cd /home/admin/work/protobuf-2.3.0/python
2 python setup.py install
3  
4 export PYTHONPATH=/home/admin/work/protobuf-2.3.0/python/setuptools-0.6c9-py2.6.egg:/home/admin/work/protobuf-2.3.0/python/dist/protobuf-2.3.0-py2.6.egg:$PYTHONPATH

这样,make python之后生成的add_person_python,list_people_python都可以正常运行了。

5. make all

1 make clean
2 make all

至此,所有的例子都可以正常编译和运行了。

这篇关于Google Protocol Buffers自带c++,java,python例子程序编译运行的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/826191

相关文章

Python中的魔术方法__new__详解

《Python中的魔术方法__new__详解》:本文主要介绍Python中的魔术方法__new__的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、核心意义与机制1.1 构造过程原理1.2 与 __init__ 对比二、核心功能解析2.1 核心能力2.2

Python虚拟环境终极(含PyCharm的使用教程)

《Python虚拟环境终极(含PyCharm的使用教程)》:本文主要介绍Python虚拟环境终极(含PyCharm的使用教程),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录一、为什么需要虚拟环境?二、虚拟环境创建方式对比三、命令行创建虚拟环境(venv)3.1 基础命令3

Python Transformer 库安装配置及使用方法

《PythonTransformer库安装配置及使用方法》HuggingFaceTransformers是自然语言处理(NLP)领域最流行的开源库之一,支持基于Transformer架构的预训练模... 目录python 中的 Transformer 库及使用方法一、库的概述二、安装与配置三、基础使用:Pi

Python 中的 with open文件操作的最佳实践

《Python中的withopen文件操作的最佳实践》在Python中,withopen()提供了一个简洁而安全的方式来处理文件操作,它不仅能确保文件在操作完成后自动关闭,还能处理文件操作中的异... 目录什么是 with open()?为什么使用 with open()?使用 with open() 进行

SpringBoot条件注解核心作用与使用场景详解

《SpringBoot条件注解核心作用与使用场景详解》SpringBoot的条件注解为开发者提供了强大的动态配置能力,理解其原理和适用场景是构建灵活、可扩展应用的关键,本文将系统梳理所有常用的条件注... 目录引言一、条件注解的核心机制二、SpringBoot内置条件注解详解1、@ConditionalOn

Python中使用正则表达式精准匹配IP地址的案例

《Python中使用正则表达式精准匹配IP地址的案例》Python的正则表达式(re模块)是完成这个任务的利器,但你知道怎么写才能准确匹配各种合法的IP地址吗,今天我们就来详细探讨这个问题,感兴趣的朋... 目录为什么需要IP正则表达式?IP地址的基本结构基础正则表达式写法精确匹配0-255的数字验证IP地

通过Spring层面进行事务回滚的实现

《通过Spring层面进行事务回滚的实现》本文主要介绍了通过Spring层面进行事务回滚的实现,包括声明式事务和编程式事务,具有一定的参考价值,感兴趣的可以了解一下... 目录声明式事务回滚:1. 基础注解配置2. 指定回滚异常类型3. ​不回滚特殊场景编程式事务回滚:1. ​使用 TransactionT

使用Python实现全能手机虚拟键盘的示例代码

《使用Python实现全能手机虚拟键盘的示例代码》在数字化办公时代,你是否遇到过这样的场景:会议室投影电脑突然键盘失灵、躺在沙发上想远程控制书房电脑、或者需要给长辈远程协助操作?今天我要分享的Pyth... 目录一、项目概述:不止于键盘的远程控制方案1.1 创新价值1.2 技术栈全景二、需求实现步骤一、需求

Spring LDAP目录服务的使用示例

《SpringLDAP目录服务的使用示例》本文主要介绍了SpringLDAP目录服务的使用示例... 目录引言一、Spring LDAP基础二、LdapTemplate详解三、LDAP对象映射四、基本LDAP操作4.1 查询操作4.2 添加操作4.3 修改操作4.4 删除操作五、认证与授权六、高级特性与最佳

Spring Shell 命令行实现交互式Shell应用开发

《SpringShell命令行实现交互式Shell应用开发》本文主要介绍了SpringShell命令行实现交互式Shell应用开发,能够帮助开发者快速构建功能丰富的命令行应用程序,具有一定的参考价... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定义S