Google Protocol Buffers自带c++,java,python例子程序编译运行
来源:互联网 发布:淘宝 真货 编辑:程序博客网 时间:2024/06/01 09:12
在我的前一篇文章《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()
in
com.google.protobuf.GeneratedMessage.Builder
原因是protobuf的版本不对,需要用最新的版本,如 2.4.1
4. 编译python例子
发现编译能成功,但是运行的时候提示找不到相关模块
1
[admin@search001 examples]$
make
python
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例子程序编译运行
- Google Protocol Buffers自带c++,java,python例子程序编译运行
- Google Protocol Buffers Java实例
- Google Protocol Buffers Java实例
- Objective C Protocol Buffers 编译
- google protocol buffers介绍(c++)
- Google protocol-buffers java版--简单使用
- (Google)Protocol Buffers概览
- Google Protocol Buffers详解
- Google Protocol Buffers
- Google Protocol Buffers安装
- GOOGLE PROTOCOL BUFFERS
- Google Protocol Buffers浅析
- Google protocol buffers 小结
- Google Protocol Buffers浅析
- Google Protocol Buffers 概述
- Google Protocol Buffers 入门
- Google Protocol Buffers 入门
- 介绍在Swift2面向协议编程(译文)
- 基于物品的协同过滤中,余弦相似度、皮尔森系数、修正余弦相似度三者的区别
- JavaScript contains
- love2d iOS 脚本打包 & xcode7 真机调试
- POJ 2480 Longge's problem(数论)
- Google Protocol Buffers自带c++,java,python例子程序编译运行
- Protocol Buffers的安装使用和C++/Python入门示例
- node.js中遇到SyntaxError: Use of const in strict mode
- 桌面版Linux提示Enter Password for Default Keyring to Unlock的解决方法
- 使用dumbo开发hadoop streaming程序
- 深入mysql "ON DUPLICATE KEY UPDATE" 语法的分析
- 运用Log和Trace文件排除Oracle Net问题
- 关于Python中的yield
- hdu 1083 Courses(二分图最大匹配)