设为首页 加入收藏

TOP

交叉编译场景(arm-linux)分析(一)
2014-11-24 12:00:22 来源: 作者: 【 】 浏览:1
Tags:交叉 编译 场景 arm-linux )分析

[学习准备]:


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


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


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



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


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


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


网上已经有不少已经构建好了的交叉编译器(toolchain),除非你想了解如何构建交叉编译器,否则直接下载一个来用是比较明智的做法。如何构建交叉编译器的知识请参考另一幅文章。



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


在这里我专门介绍一下autoconf的相关知识,以方便用户学习。


------------------------------------------------------------------


官方下载地址:ftp://ftp.gnu.org/gnu/autoconf/)。


------------------------------------------------------------------


Autoconf的内容:


Autoconf 能生成用于自动配置源代码的 shell 脚本。


安装下列程序: autoconf, autoheader, autom4te, autoreconf, autoscan, autoupdate 和 ifnames


------------------------------------------------------------------


简要说明:


autoconf是一个产生可以自动配置源代码包,生成shell脚本的工具,以适应各种类UNIX系统的需要。autoconf 产生的配置脚本在运行时独立于autoconf ,因此使用这些脚本的用户不需要安装autoconf。


autoheader能够产生供configure脚本使用的C #define语句模板文件。


autom4te对文件执行 GNU M4。


autoreconf,如果有多个autoconf产生的配置文件,autoreconf可以保存一些工作,它通过重复运行autoconf(以及在合适的地方运行autoheader)以重新产生autoconf配置脚本和配置头模板,这些文件保存在以当前目录为根的目录树中。


autoscan程序可以用来为软件包创建configure.in文件。autoscan在以命令行参数中指定的目录为根(如果未给定参数,则以当前目录为根)的目录树中检查源文件。它为通常的轻便问题搜索源文件,并且为那个包创建一个configure.scan文件,这个文件就是configure.in的前身。


autoupdate程序将一个调用autoconf 宏的旧名称的configure.in文件中的宏更新为新的名称。


ifnames当为一个软件包写configure.in 时,ifnames可以提供一些帮助。它打印包中那些在C预处理器中已经使用了的表示符。如果一个包已经设置成具有某些可移植属性,这个程序能够帮助指出它的配置应该如何检查。它可以用来填补由autoscan产生的configure.in中的隔阂。


------------------------------------------------------------------


Autoconf 安装依赖关系


Autoconf 依赖于: Bash, Coreutils, Diffutils, Grep, M4, Make, Perl, Sed.


[一.基本知识]


在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
























--------------------------------------------------------------


正式发布的软件包里,已经有做好的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的使用,可以参考笔者另外一篇文章,这里不再多说。)



[二.文档惯例及隐含前提]:


--------------------------------------------------------------


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


交叉编译器版本:3.4.3


目标操作系统版本:2.6.9


默认依赖关系:依赖glibc


隐含环境变量:


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


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


ARCH:目标平台的体系架

首页 上一页 1 2 3 4 5 6 7 下一页 尾页 1/7/7
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇POSIX线程的私有数据 下一篇POSIX线程的创建和取消

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·在 Redis 中如何查看 (2025-12-26 03:19:03)
·Redis在实际应用中, (2025-12-26 03:19:01)
·Redis配置中`require (2025-12-26 03:18:58)
·Asus Armoury Crate (2025-12-26 02:52:33)
·WindowsFX (LinuxFX) (2025-12-26 02:52:30)