首页 > *nix应用编程, *nix技术, 应用程序 > linux环境下protobuf-c的编译使用

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

2016年3月12日 发表评论 阅读评论 8,220 次浏览

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 you
installed 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/2480http://lenky.info/?p=2480


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

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

  1. 2016年3月28日15:32 | #1

    楼主,大sangfor在长沙有研发分部了,湖南的几乎都回去了,QQ

  2. swire
    2016年3月12日20:18 | #2

    我去,多久没更新……我都快要忘记了。

  1. 2016年3月12日17:21 | #1
  2. 2016年3月13日16:26 | #2