原文:http://blog.csdn.net/yuezhiren/article/details/8094755
文章记录了交叉编译google protobuf 的整个过程。
build 环境:
OS/hardware-platform : Linux ubuntu 3.2.0-32-generic-pae #51-Ubuntu SMP Wed Sep 26 21:54:23 UTC 2012 i686 i686 i386 GNU/Linux
CROSS_COMPILER : gcc version 4.3.2 (Sourcery G++ Lite 2008q3-72) 【已经设置了PATH 】
Target 环境:
OS/hardware-platform : Linux at91.linux 2.6.30 #2 Wed Oct 10 23:33:55 CST 2012 armv5tejl GNU/Linux
1. 从官网下载最新的 protobuf, https://code.google.com/p/protobuf/downloads/list ,目前最新的是 2.4.1
- tar -xvjf protobuf-2.4.1.tar.bz2
【tar tips: 首个字符 x 是必须的 , 代表解压; v 代表 verbose, 代表输出所有解压文件信息 ; j 代表 bzip2 ,即 bz2格式, 有时候也用z, z代表 gzip ; f 代表使用的是归档文件 】
2 . build protobuf , 有以下需要注意的地方:
<1> protobuf 中的 README.txt 提到了在交叉编译 protobuf 时需要加上选项 --with-protoc , 例如, 如果在本地已经安装过 protobuf, 则 configure 的配置选项:
- ./configure --with-protoc=protoc 【。。。。。。。。。其他配置选项】
需要注意的是 protoc 的版本必须要当前protobuf版本一致。
我的做法是: 先再本地编译/安装protobuf,然后再按照上面的样式指定
- ./confgure
- make
- sudo make install
- make distclean
- ./configure --with-protoc=protoc 【。。。。。。。。。其他配置选项】
详细内容猛戳 :README.txt
<2> 启用 configure 的交叉编译功能
重点在于如何通过命令行启用 configure 的交叉编译功能,这些命令行又是如何在起作用。需要注意的是,
2.4.1所使用的 autoconf 是 2.65, 随着升级, autoconf 发生了很多变化, 具体解释请猛戳 :从2.13升级到2.50
重点的命令行如下 :
--build 用于描述编译环境, 在我的环境中设置为 i686-pc-linux (x86_64 , ubuntu)
--host 用于描述目标程序包的运行环境,当 --host 与 --build 的值不同时,启用交叉编译模式。
在我的环境中设置为 arm-linux。 【由于历史原因,当设置 --host 时,一定需要设置 --build】
--target 用于配置交叉编译环境(很少用到),默认与 --host 相同。 比如我的host 设置成为 arm-linux ,
那么使用的 arm-linux-gcc 编译。
【还没有搞清楚详细的交叉编译配置功能,暂时就我的机器来看, configure 是这么做的】
这么一来我的机器的 configure 命令行则为 :
- ./configure --build=i686-pc-linux --host=arm-linux --with-protoc=protoc
注1 : autoconf 用户手册
注2 : 三个参数的说明
注3 : 交叉编译说明
<3> 其他 , 包括设置安装路径, 设置静态库
为了方便开发, 我使用的是 nfs root 【详细猛戳 : NFS-HOWTO 】 , 所以只需要把 protobuf 安装到本地目录下即可,另外由于静态链接会提升运行性能,所以使用编译静态库,整个 configure 则为 :
- ./configure --build=i686-pc-linux --host=arm-linux --with-protoc=protoc --disable-shared --prefix=/home/marmot/sample_fs/rootfs/usr
然后
make
sudo make install 即可
3 . 在嵌入式系统中使用 protobuf
protobuf-lite 是 专门为嵌入式系统优化的runtime,牺牲了一些特性,换来了一些相对小的库以及不错的性能.
要使用protobuf-lite ,需要在所定义的proto文件中需要声明:
- option optimize_for = LITE_RUNTIME;
帮助猛戳 : protobuf language guide
还有一个问题没有搞定:
编译armv5版本的protobuf,编译器默认 armv4T
[ 根据 automake 中关于 user variable 中的说明, 再 configure 预定义CFLAGS CXXFLAGS一下就可以使用了 ]
- ./configure --build=i686-pc-linux --host=arm-linux --with-protoc=protoc --disable-shared --prefix=/home/marmot/Downloads/testinstall CFLAGS=' -march=armv5 ' CXXFLAGS=' -march=armv5 '