转载

linux环境下protobuf-c的编译使用

1,下载protobuf-c源码,地址在这里:

https://github.com/protobuf-c/protobuf-c

我这里下载protobuf-c-1.2.1.tar.gz,解压后在目录里执行:./autogen.sh

可能会报差一些库,对应的安装即可,比如ubuntu上:

sudo apt-get install autoconf

sudo apt-get install libtool

除了差库错误之外,还可能的错误是autoconf的版本过低,比如我在centos 6.2上编译就会报:

configure.ac:1: error: Autoconf version 2.64 or higher is required

configure.ac:1: the top level

autom4te: /usr/bin/m4 failed with exit status: 63

aclocal: error: echo failed with exit status: 63

autoreconf: aclocal failed with exit status: 63

通过命令autoconf –version,查看系统dautoconf版本为2.63,只相差一个小版本号,直接修改文件configure.ac

把第一行:AC_PREREQ(2.64)

改为:AC_PREREQ(2.63)

再执行./autogen.sh即可顺利生成configure文件.

执行./configure,报错差proto库:

checking for protobuf… no

configure: error: Package requirements (protobuf >= 2.6.0) were not met:

No package ‘protobuf’ found

Consider adjusting the PKG_CONFIG_PATH environment variable if youinstalled software in a non-standard prefix.

Alternatively, you may set the environment variables protobuf_CFLAGS

and protobuf_LIBS to avoid the need to call pkg-config.

See the pkg-config man page for more details.

出现这种情况是因为系统差libprotobuf-dev库或者系统安装的libprotobuf-dev版本低于2.6.0,不管哪种情况,下面采用直接编译protobuf源码的形式解决问题.

2,下载protobuf源码,地址在这里:

https://github.com/google/protobuf/releases/tag/v2.6.1

我这里下载protobuf-2.6.1.tar.bz2,解压后直接在目录里执行:./configure –prefix=/usr –libdir=/usr/lib

如果执行失败,看是否差基本的编译环境,比如:sudo apt-get install g++

然后执行

make

sudo make install

安装protobuf到系统.

如果是64位系统,并且默认的lib库位置在/usr/lib64,则需要这样执行configure:./configure –prefix=/usr –libdir=/usr/lib64

3,重新编译protobuf-c源码,即执行:

./autogen.sh

./configure

make

最终的产出结果:

~/Downloads/gqk/protobuf-c-1.2.1$ ls protoc-c/protoc-c -F

protoc-c/protoc-c*

cusd@cupc:~/Downloads/gqk/protobuf-c-1.2.1$ ls protobuf-c/.libs/ -F

libprotobuf-c.a libprotobuf-c.lai libprotobuf-c.so.1@ protobuf-c.o

libprotobuf-c.la@ libprotobuf-c.so@ libprotobuf-c.so.1.0.0*

~/Downloads/gqk/protobuf-c-1.2.1$

4,使用实例:

a,创建对应的proto文件:

~/Downloads/gqk/test$ cat Person.proto

message Person

{

required string name = 2;

required int32 age = 4;

}

b,生成c和h文件:

~/Downloads/gqk/test$ ../protobuf-c-1.2.1/protoc-c/protoc-c –c_out=. Person.proto

~/Downloads/gqk/test$ ls

Person.pb-c.c Person.pb-c.h Person.proto

c,简单main.c文件和编译运行:

~/Downloads/gqk/test$ cat main.c #include <stdio.h> #include <errno.h> #include <stdlib.h> #include <string.h> #include "Person.pb-c.h"  int main() {  void *buf = NULL;  int buf_len;  size_t ret;   Person *person2;  Person person = PERSON__INIT;  person.name = "liming";  person.age = 20;   buf_len = person__get_packed_size(&person);  if ((buf = malloc(buf_len)) == NULL)   return -1;   ret = person__pack(&person, buf);  printf("buf_len:%d/tpacked_size:%lu/n", buf_len, ret);   if ((person2 = person__unpack(NULL, buf_len, buf)) == NULL)   goto err;   printf("name:%s/tage:%d/n", person2->name, person2->age);   person__free_unpacked(person2, NULL);  free(buf);  return 0;  err:  free(buf);  return -1; }

~/Downloads/gqk/test$ gcc -I../protobuf-c-1.2.1/ Person.pb-c.c main.c -o main -lprotobuf-c -L../protobuf-c-1.2.1/protobuf-c/.libs/

~/Downloads/gqk/test$ export LD_LIBRARY_PATH=../protobuf-c-1.2.1/protobuf-c/.libs/

~/Downloads/gqk/test$ ./main

buf_len:10 packed_size:10

name:liming age:20

Over~

转载请保留地址: http://www.lenky.info/archives/2016/03/2480 或 http://lenky.info/?p=2480

备注:如无特殊说明,文章内容均出自Lenky个人的真实理解而并非存心妄自揣测来故意愚人耳目。由于个人水平有限,虽力求内容正确无误,但仍然难免出错,请勿见怪,如果可以则请留言告之,并欢迎来 信 讨论。另外值得说明的是,Lenky的部分文章以及部分内容参考借鉴了网络上各位网友的热心分享,特别是一些带有完全参考的文章,其后附带的链接内容也许更直接、更丰富,而我只是做了一下归纳&转述,在此也一并表示感谢。关于本站的所有技术文章,欢迎转载,但请遵从 CC创作共享协议 ,而一些私人性质较强的心情随笔,建议不要转载。

法律:根据最新颁布的《信息网络传播权保护条例》,如果您认为本文章的任何内容侵犯了您的权利,请以 Email 或书面等方式告知,本站将及时删除相关内容或链接。

原文  http://www.lenky.info/archives/2016/03/2480
正文到此结束
Loading...