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 或书面等方式告知,本站将及时删除相关内容或链接。