交叉编译 google protobuf

时间:2021-02-01 14:52:10

原文: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

     

[plain]  view plain copy
  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 的配置选项:


[plain]  view plain copy
  1. ./configure --with-protoc=protoc 【。。。。。。。。。其他配置选项】  

需要注意的是 protoc 的版本必须要当前protobuf版本一致。

我的做法是: 先再本地编译/安装protobuf,然后再按照上面的样式指定

[plain]  view plain copy
  1. ./confgure  
  2. make  
  3. sudo make install  
  4. make distclean  
  5. ./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 命令行则为 :

[plain]  view plain copy
  1. ./configure --build=i686-pc-linux  --host=arm-linux --with-protoc=protoc  

注1 :   autoconf 用户手册

注2 : 三个参数的说明

注3  :   交叉编译说明


<3> 其他 , 包括设置安装路径, 设置静态库

   为了方便开发, 我使用的是 nfs root 【详细猛戳 :  NFS-HOWTO 】 , 所以只需要把 protobuf 安装到本地目录下即可,另外由于静态链接会提升运行性能,所以使用编译静态库,整个 configure 则为 :

[plain]  view plain copy
  1. ./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文件中需要声明:

       

[plain]  view plain copy
  1. option optimize_for = LITE_RUNTIME;  


帮助猛戳  :  protobuf language guide 


还有一个问题没有搞定:

     编译armv5版本的protobuf,编译器默认 armv4T


[ 根据 automake 中关于 user variable 中的说明, 再 configure 预定义CFLAGS CXXFLAGS一下就可以使用了 ]

[plain]  view plain copy
  1. ./configure --build=i686-pc-linux  --host=arm-linux --with-protoc=protoc --disable-shared --prefix=/home/marmot/Downloads/testinstall CFLAGS=' -march=armv5 '  CXXFLAGS=' -march=armv5  '