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

by flying5 
in  nosql on 2011-08-26 | tags:  c  java  ProtocolBuffer  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的例子,但是没有设置环境变量的话,会有很多错误:

[admin@search001 examples]$ make
protoc --cpp_out=. --java_out=. --python_out=. addressbook.proto
pkg-config --cflags protobuf  # fails if protobuf is not installed
Package protobuf was not found in the pkg-config search path.
Perhaps you should add the directory containing `protobuf.pc'
to the PKG_CONFIG_PATH environment variable
No package 'protobuf' found
make: *** [add_person_cpp] Error 1
这个是因为Makefile中会用pkg-config命令检测环境变量,但是没有设置PKG_CONFIG_PATH,找不到protobuf.pc这个文件
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 会出现一大堆的找不到包的错误:

[admin@search001 examples]$ make java
javac AddPerson.java ListPeople.java com/example/tutorial/AddressBookProtos.java                                                                             
com/example/tutorial/AddressBookProtos.java:12: package com.google.protobuf does not exist
      com.google.protobuf.GeneratedMessage {                                                                                                                 
                         ^
com/example/tutorial/AddressBookProtos.java:9: package com.google.protobuf does not exist                                                                    
      com.google.protobuf.ExtensionRegistry registry) {
                         ^                                                                                                                                   
com/example/tutorial/AddressBookProtos.java:1210: package com.google.protobuf.Descriptors does not exist
  private static com.google.protobuf.Descriptors.Descriptor
需要自己编译protobuf的jar包了,要先安装好maven才能编译哦
cd  /home/admin/work/protobuf-2.3.0/java
mvn package
最终会生成一个jar包 /home/admin/work/protobuf-2.3.0/java/target/protobuf-java-2.3.0.jar

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

设置java classpath:

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两个可执行脚本。脚本内容如下:
[admin@search001 examples]$ cat add_person_java 
#! /bin/sh
java -classpath .:$CLASSPATH AddPerson "$@"
[admin@search001 examples]$ cat list_people_java 
#! /bin/sh
java -classpath .:$CLASSPATH ListPeople "$@"
如果在编译的时候出现如下的错误:
[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:
[ERROR] ... is not abstract and does not override abstract method newBuilderForType(com.google.protobuf.GeneratedMessage.BuilderParent) in com.google.protobuf.GeneratedMessage
[ERROR] ... is not abstract and does not override abstract method internalGetFieldAccessorTable() in com.google.protobuf.GeneratedMessage.Builder
原因是protobuf的版本不对,需要用最新的版本,如 2.4.1

4. 编译python例子

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

[admin@search001 examples]$ make python                                                                                                                        
protoc --cpp_out=. --java_out=. --python_out=. addressbook.proto
Writing shortcut script add_person_python...                                                                                                                 
Writing shortcut script list_people_python...
[admin@search001 examples]$ ./add_person_python                                                                                                                
Traceback (most recent call last):
  File "./add_person.py", line 5, in ?                                                                                                                       
    import addressbook_pb2
  File "/home/admin/work/protobuf-2.3.0/examples/addressbook_pb2.py", line 3, in ?                                                                                       
    from google.protobuf import descriptor
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。
cd /home/admin/work/protobuf-2.3.0/python
python setup.py install

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

make clean
make all
至此,所有的例子都可以正常编译和运行了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值