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

相关文章

Spring Boot中的路径变量示例详解

《SpringBoot中的路径变量示例详解》SpringBoot中PathVariable通过@PathVariable注解实现URL参数与方法参数绑定,支持多参数接收、类型转换、可选参数、默认值及... 目录一. 基本用法与参数映射1.路径定义2.参数绑定&nhttp://www.chinasem.cnbs

C++中全局变量和局部变量的区别

《C++中全局变量和局部变量的区别》本文主要介绍了C++中全局变量和局部变量的区别,全局变量和局部变量在作用域和生命周期上有显著的区别,下面就来介绍一下,感兴趣的可以了解一下... 目录一、全局变量定义生命周期存储位置代码示例输出二、局部变量定义生命周期存储位置代码示例输出三、全局变量和局部变量的区别作用域

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

JAVA中安装多个JDK的方法

《JAVA中安装多个JDK的方法》文章介绍了在Windows系统上安装多个JDK版本的方法,包括下载、安装路径修改、环境变量配置(JAVA_HOME和Path),并说明如何通过调整JAVA_HOME在... 首先去oracle官网下载好两个版本不同的jdk(需要登录Oracle账号,没有可以免费注册)下载完

Spring StateMachine实现状态机使用示例详解

《SpringStateMachine实现状态机使用示例详解》本文介绍SpringStateMachine实现状态机的步骤,包括依赖导入、枚举定义、状态转移规则配置、上下文管理及服务调用示例,重点解... 目录什么是状态机使用示例什么是状态机状态机是计算机科学中的​​核心建模工具​​,用于描述对象在其生命

Spring Boot 结合 WxJava 实现文章上传微信公众号草稿箱与群发

《SpringBoot结合WxJava实现文章上传微信公众号草稿箱与群发》本文将详细介绍如何使用SpringBoot框架结合WxJava开发工具包,实现文章上传到微信公众号草稿箱以及群发功能,... 目录一、项目环境准备1.1 开发环境1.2 微信公众号准备二、Spring Boot 项目搭建2.1 创建

Java中Integer128陷阱

《Java中Integer128陷阱》本文主要介绍了Java中Integer与int的区别及装箱拆箱机制,重点指出-128至127范围内的Integer值会复用缓存对象,导致==比较结果为true,下... 目录一、Integer和int的联系1.1 Integer和int的区别1.2 Integer和in

SpringSecurity整合redission序列化问题小结(最新整理)

《SpringSecurity整合redission序列化问题小结(最新整理)》文章详解SpringSecurity整合Redisson时的序列化问题,指出需排除官方Jackson依赖,通过自定义反序... 目录1. 前言2. Redission配置2.1 RedissonProperties2.2 Red

IntelliJ IDEA2025创建SpringBoot项目的实现步骤

《IntelliJIDEA2025创建SpringBoot项目的实现步骤》本文主要介绍了IntelliJIDEA2025创建SpringBoot项目的实现步骤,文中通过示例代码介绍的非常详细,对大家... 目录一、创建 Spring Boot 项目1. 新建项目2. 基础配置3. 选择依赖4. 生成项目5.

JSONArray在Java中的应用操作实例

《JSONArray在Java中的应用操作实例》JSONArray是org.json库用于处理JSON数组的类,可将Java对象(Map/List)转换为JSON格式,提供增删改查等操作,适用于前后端... 目录1. jsONArray定义与功能1.1 JSONArray概念阐释1.1.1 什么是JSONA