交叉编译场景分析(arm-linux)--序

来源:互联网 发布:阿里云服务器到期 编辑:程序博客网 时间:2024/04/19 20:36
 

交叉编译场景分析(arm-linux)--

 

去年花了一个多月时间,为arm-linux平台编译程序库,其中包括zlibreadlinencursestslibTinyXlibpngjpegcairopangoglibatkgtk+match系列、SCIMGPE系列。由于之前没有经验,走了不少弯路,虽然从中学到了一些知识,大部分时间都浪费了。最近一些同事和朋友常问我一些关于交叉编译的问题,我想有必要总结一下,和大家分享一些心得。

 

什么是交叉编译呢?在回答这个问题前,我们先解释两个概念:

 

  机:运行编译过程的计算机。

目标机:运行编译结果(可执行文件)的计算机。

 

一般情况下,主机和目标机是同一类型的计算机,这就是正常的编译,没有什么好说的。所谓交叉编译就是在主机上为目标机编译,比如在PC上编译,然后在手机上运行,这种编译就叫交叉编译。

 

交叉编译需要交叉编译器,不同的目标机(主要是看芯片类型)需要不同的交叉编译器,比如我们这里要介绍的arm-linux交叉编译,所用的交叉编译器就是arm-linux-gcc系列。

 

构建一个交叉编译器(toolchain),说简单也简单,说复杂也复杂。原理上很简单,实际情况常常比较复杂,原因是编译器一直处于开发状态,你要了解某个版本的稳定性,要去找patch。有时候还要看你的运气好不好,折腾一个星期才搞定也是很常见的。

 

网上已经有不少已经构建好了的交叉编译器(toolchain),除非你想了解如何构建交叉编译器,否则直接下载一个来用是比较明智的做法。这里不打算介绍如何构建交叉编译器的知识。

 

在做交叉编译前,你最好了解autoconf系统工具的用法,遇到问题时,可以快速定位。先找一本autoconf的书看看,可以说是磨刀不识砍柴功,否则后面会浪费更多的时间。

交叉编译场景分析(arm-linux)()--基本知识

 

转载时请注明出处:http://blog.csdn.net/absurd

 

1.         基本知识

linux下,绝大部分的软件包都是用autoconf配置的。除此之外,比较有名的就是X11imake配置方式,imake实际上有点过时了,用起来很不方便,所以xfree86已经计划向autoconf移植了。还有极少的直接使用Makefile编译,通过环境变量或者不同的Makefile配置,当然这只适用于简单的软件包。

 

Autoconf是一个非常有用的配置工具,原理有点复杂,全面了解它要花不少时间,但使用很方便。这里简单介绍一下autoconf交叉编译的基本知识。

 

下载软件包无非两种方式,一种是直接从cvs里取最新版本,另一种是取发布的稳定版本。除非你想测试最新版本,否则后者是比较安全的方式。但有的软件包不提供发布的版本,这时就只能退而求其次了-使用cvs版本了。

 

编译cvs版本有一点不同,cvs版本通常不带configure脚本的,自己要重新产生configure脚本。当然这并不困难,多数开发人员都会在自己的软件包里,放上一个autogen.sh或者bootstartup之类的脚本。利用这个脚本可以自动产生configure脚本。下面是一个autogen.sh脚本示例,若软件包里没有提供这样的文件,可以仿照写一个:

 

#!/bin/sh

# $Id: autogen.sh,v 1.3 2005/02/26 01:47:22 kergoth Exp $

 

autoreconf -f -i -I `pwd`/m4

exit $?

 

echo -n "Libtoolize..."

libtoolize --force --copy

echo "Done."

echo -n "Aclocal..."

aclocal

echo "Done."

echo -n "Autoheader..."

autoheader

echo "Done."

echo -n "Automake..."

automake --add-missing --copy

echo "Done."

echo -n "Autoconf..."

autoconf

echo "Done."

#./configure $*

echo "Now you can do ./configure, make, make install."

 

正式发布的软件包里,已经有做好的configure脚本了。接下来我们要做的就是利用configure进行配置。对于交叉编译来说,最重要的配置选项有以下几个:

 

--host指定目标机的平台类型。一般格式为CPU类型-操作系统名称。比如,目标机的CPUarm,操作系统为linux,可以这样写--host=arm-linux

--prefix这是安装路径的前缀,即编译结果放置的位置。默认值是/usr或者/usr/local,交叉编译时不能使用默认值,否则它会覆盖你本机的文件,所以要指定一个路径。比如,可以指定为--prefix=/work/cross/rootfs/usr

 

配置完成后,运行make编译,运行make install安装。

 

(pkg-config也是一个非常重要的工具,关于pkg-config的使用,可以参考笔者另外一篇文章,这里不再多说。)

 

2.         文档惯例及隐含前提:

 

交叉编译器名称:arm-linux-gcc

交叉编译器版本:3.4.3

目标操作系统版本:2.6.9

默认依赖关系:依赖glibc

 

隐含环境变量:

WORK_DIR:工作目录,设置为/work/cross

ROOTFS_DIR:编译结果根目录,设置为$WORK_DIR/rootfs

ARCH:目标平台的体系架构,设置为arm

 

建立一个脚本用于设置变量和建立必要的目录,在编译前,先运行. corss.env 其内容如下:

 

cross.env

export WORK_DIR=/work/cross

export ROOTFS_DIR=$WORK_DIR/rootfs

export ARCH=arm

export PKG_CONFIG_PATH=$ROOTFS_DIR/usr/local/lib/pkgconfig:$ROOTFS_DIR/usr/lib/pkgconfig:$ROOTFS_DIR/usr/X11R6/lib/pkgconfig

 

if [ ! -e "$ROOTFS_DIR/usr/local/include" ]; then mkdir -p $ROOTFS_DIR/usr/local/include;fi;

if [ ! -e "$ROOTFS_DIR/usr/local/lib" ]; then mkdir -p $ROOTFS_DIR/usr/local/lib; fi;

if [ ! -e "$ROOTFS_DIR/usr/local/etc" ]; then mkdir -p $ROOTFS_DIR/usr/local/etc; fi;

if [ ! -e "$ROOTFS_DIR/usr/local/bin" ]; then mkdir -p $ROOTFS_DIR/usr/local/bin; fi;

if [ ! -e "$ROOTFS_DIR/usr/local/share" ]; then mkdir -p $ROOTFS_DIR/usr/local/share; fi;

if [ ! -e "$ROOTFS_DIR/usr/local/man" ]; then mkdir -p $ROOTFS_DIR/usr/local/man; fi;

 

if [ ! -e "$ROOTFS_DIR/usr/include" ]; then mkdir -p $ROOTFS_DIR/usr/include; fi;

if [ ! -e "$ROOTFS_DIR/usr/lib" ]; then mkdir -p $ROOTFS_DIR/usr/lib; fi;

if [ ! -e "$ROOTFS_DIR/usr/etc" ]; then mkdir -p $ROOTFS_DIR/usr/etc; fi;

if [ ! -e "$ROOTFS_DIR/usr/bin" ]; then mkdir -p $ROOTFS_DIR/usr/bin; fi;

if [ ! -e "$ROOTFS_DIR/usr/share" ]; then mkdir -p $ROOTFS_DIR/usr/share; fi;

if [ ! -e "$ROOTFS_DIR/usr/man" ]; then mkdir -p $ROOTFS_DIR/usr/man; fi;

 

颜色字体含义

颜色字体 表示错误信息。

颜色字体 表示命令行脚本。

颜色字体 表示文件内容。

 

文档格局:

 

1.         基本信息:

软件名称

 

功能简述

 

下载地址

 

软件版本

 

依赖关系

 

前置条件

 

 

2.         过程分析

构建过程中遇到的问题分析。

3.         构建处方

通常是一个可用的Makefile,用它可以编译这个模块。或者一些patch文件。

原创粉丝点击