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

相关文章

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

SpringBoot全局域名替换的实现

《SpringBoot全局域名替换的实现》本文主要介绍了SpringBoot全局域名替换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录 项目结构⚙️ 配置文件application.yml️ 配置类AppProperties.Ja

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、

Python中 try / except / else / finally 异常处理方法详解

《Python中try/except/else/finally异常处理方法详解》:本文主要介绍Python中try/except/else/finally异常处理方法的相关资料,涵... 目录1. 基本结构2. 各部分的作用tryexceptelsefinally3. 执行流程总结4. 常见用法(1)多个e

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java