交叉编译场景分析

交叉编译场景分析(arm-linux)--序
 
去年花了一个多月时间,为arm-linux平台编译程序库,其中包括zlib、readline、ncurses、tslib、TinyX、libpng、jpeg、cairo、pango、glib、atk、gtk+、match系列、SCIM、GPE系列。由于之前没有经验,走了不少弯路,虽然从中学到了一些知识,大部分时间都浪费了。最近一些同事和朋友常问我一些关于交叉编译的问题,我想有必要总结一下,和大家分享一些心得。
 
什么是交叉编译呢?在回答这个问题前,我们先解释两个概念:
 
主  机:运行编译过程的计算机。
目标机:运行编译结果(可执行文件)的计算机。
 
一般情况下,主机和目标机是同一类型的计算机,这就是正常的编译,没有什么好说的。所谓交叉编译就是在主机上为目标机编译,比如在PC上编译,然后在手机上运行,这种编译就叫交叉编译。
 
交叉编译需要交叉编译器,不同的目标机(主要是看芯片类型)需要不同的交叉编译器,比如我们这里要介绍的arm-linux交叉编译,所用的交叉编译器就是arm-linux-gcc系列。
 
构建一个交叉编译器(toolchain),说简单也简单,说复杂也复杂。原理上很简单,实际情况常常比较复杂,原因是编译器一直处于开发状态,你要了解某个版本的稳定性,要去找patch。有时候还要看你的运气好不好,折腾一个星期才搞定也是很常见的。
 
网上已经有不少已经构建好了的交叉编译器(toolchain),除非你想了解如何构建交叉编译器,否则直接下载一个来用是比较明智的做法。这里不打算介绍如何构建交叉编译器的知识。
 
在做交叉编译前,你最好了解autoconf系统工具的用法,遇到问题时,可以快速定位。先找一本autoconf的书看看,可以说是磨刀不识砍柴功,否则后面会浪费更多的时间。
 
交叉编译场景分析(arm-linux)(一)--基本知识
1.  基本知识
在linux下,绝大部分的软件包都是用autoconf配置的。除此之外,比较有名的就是X11的imake配置方式,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类型-操作系统名称。比如,目标机的CPU为arm,操作系统为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;
 
颜色字体含义
颜色字体表示错误信息。
颜色字体 表示命令行脚本。
颜色字体 表示文件内容。
 
文档格局:
基本信息

软件名称
 
功能简述
 
下载地址
 
软件版本
 
依赖关系
 
前置条件
 

 
 过程分析
构建过程中遇到的问题分析。
 
构建处方
         通常是一个可用的Makefile,用它可以编译这个模块。或者一些patch文件。
//
交叉编译场景分析(arm-linux)(二)--编译tslib
交叉编译场景分析(arm-linux)(三)--编译zlib
交叉编译场景分析(arm-linux)(四)--编译readline和ncurs
交叉编译场景分析(arm-linux)()--编译libjpeglibpng
交叉编译场景分析(arm-linux)()--编译TinyX

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

http://blog.csdn.net/absurd/archive/2006/04/01/646988.aspx

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

http://blog.csdn.net/absurd/archive/2006/04/01/646993.aspx

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: OpenWrt是一种嵌入式Linux操作系统,旨在为网络设备提供自定义的固件。其编译框架是OpenWrt开发中的重要组成部分。 OpenWrt的编译框架基于Makefile,具有灵活性和可扩展性。它由多个组件组成,包括Toolchain、Package和Target。 Toolchain是OpenWrt编译工具链的核心组件,用于生成适用于目标硬件的工具和库。它包括交叉编译器、库、头文件等。通过配置Toolchain,可以指定目标硬件的体系结构、处理器类型等信息。这样,在编译软件包时,可以使用正确的工具链生成适用于目标硬件的可执行文件。 Package是OpenWrt的软件包管理系统,用于添加、删除、更新和配置软件包。软件包可以是应用程序、库或驱动程序等。每个软件包都有一个Makefile,用于描述如何编译安装和配置软件包。通过Package,用户可以方便地选择需要的软件包,并将其集成到OpenWrt固件中。 Target是OpenWrt的目标平台配置,用于定义目标设备的硬件和软件环境。通过选择合适的Target,可以定制不同类型的OpenWrt固件,如路由器、无线电、音频设备等。在Target中,可以配置目标设备的参数,如处理器类型、内存大小、网络接口等。这样,在编译固件时,可以根据目标设备的需求进行优化。 OpenWrt编译框架的优点是具有灵活性和可扩展性。用户可以自定义编译选项、添加自己的软件包和功能,满足个性化需求。此外,OpenWrt社区也提供了丰富的软件包和插件,方便用户快速构建功能丰富的固件。 总之,OpenWrt的编译框架是一个强大的工具,可以帮助开发者定制和构建高度定制化的嵌入式Linux固件。通过灵活配置Toolchain、Package和Target,用户可以实现各种硬件平台的定制需求,并扩展功能以满足特定的应用场景。 ### 回答2: OpenWrt是一个开放源代码的嵌入式操作系统,可用于路由器和其他嵌入式设备。它基于Linux内核,并提供了一个灵活、可定制的编译框架。 OpenWrt的编译框架是一个为用户定制操作系统的工具集合。它提供了一套规范的构建脚本和配置文件,可以进行针对特定硬件平台的编译和配置。 OpenWrt编译框架的主要组成部分包括: 1. 源码管理:使用Git作为版本控制系统,可以方便地获取、更新和管理OpenWrt的源代码。 2. 构建系统:使用Makefile来管理编译过程,可以定制所需软件包的编译选项、依赖关系等。 3. 配置文件:使用menuconfig工具来配置打包进OpenWrt固件的软件包。可以选择需要的功能和驱动程序,并进行一些简单的配置,如网络设置、用户管理等。 4. 软件包管理:提供了opkg包管理工具,可以方便地安装、升级、删除软件包,也可以通过自定义软件包仓库来扩展功能。 5. 交叉编译:OpenWrt支持在常见的硬件平台上进行交叉编译,可以在个人电脑上进行编译,然后将生成的固件安装到目标设备上。 6. 文档和社区:OpenWrt提供了详细的文档和丰富的社区资源,用户可以查阅文档了解各种配置和编译选项,也可以在社区中寻求帮助和交流。 通过使用OpenWrt的编译框架,用户可以根据自己的需求构建一个定制化的嵌入式操作系统。无论是增加特定的功能模块,还是优化性能和资源占用,OpenWrt的编译框架都能提供灵活和方便的工具和选项。此外,OpenWrt的庞大社区也为用户提供了丰富的经验和资源,可以更好地支持用户在使用和定制过程中遇到的问题。 ### 回答3: OpenWrt是一个基于Linux的嵌入式操作系统,专为路由器和其他网络设备设计。OpenWrt提供了一个开放的源代码编译框架,允许用户自定义和编译自己的固件。 OpenWrt编译框架的分析主要包括以下几个方面: 1. 源代码管理:OpenWrt使用git进行源代码管理,用户可以通过git命令进行代码的版本控制和更新。通过git,用户可以轻松地切换到不同的分支或标签,以获取不同版本的代码。 2. 软件包管理:OpenWrt采用了自己的软件包管理系统,即使用makefile构建软件包。软件包以源代码的方式进行管理,并可以根据用户的需要进行定制。用户可以通过make menuconfig命令选择需要的软件包,并自动生成对应的makefile脚本。 3. 编译环境配置:在编译OpenWrt之前,需要先配置编译环境。这包括选择交叉编译工具链、设置编译参数和路径等。用户可以根据自己的需求进行配置,以确保编译环境的正确性和兼容性。 4. 系统配置:OpenWrt提供了一个web界面用于系统配置。用户可以通过web界面进行网络配置、系统升级、软件安装等操作。在编译过程中,用户也可以在make menuconfig中进行系统配置,如选择网络协议、网络服务和驱动程序等。 5. 编译过程:OpenWrt的编译过程基本上是通过make命令和makefile脚本完成的。在make命令的驱动下,makefile会根据用户的配置选择需要编译的软件包,并生成可执行文件。编译过程可能需要一定的时间,取决于计算机的性能和编译的软件包数量。 总之,OpenWrt的编译框架提供了一个灵活和可定制的环境,使用户能够轻松地配置、编译和定制自己的嵌入式操作系统。通过对编译框架的分析,用户可以更好地理解和使用OpenWrt,并满足自己特定的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值