第二课 创建嵌入式Linux开发环境之交叉编译环境

2019-07-13 00:44发布

上一次的内容我们主要讲了如何在如何搭建一个Linux 开发环境,这次我们就要根据不同的目标平台,建立自己的ARM-Linux的交叉编译环境。
     搭建交叉编译环境的方法有很多,不同的体系结构、不同的操作内容甚至不同的内核版本,都会用到不同的交叉编译器。比如uboot,kernel,文件系统需要的编译环境各不相同。所以,选择合适的交叉编译器对于嵌入式 开发是非常重要的。一般一个完整的交叉编译器涉及到多个软件,主要包括binutils、gcc、glibc等。其中,binutils主要生成一些辅助工具;gcc是用来生成交叉编译器,主要生成arm-linux-gcc交叉编译工具,耳glibc主要提供用户程序所需要的一些基本函数库。
    看起来交叉编译环境的搭建比较复杂,所以一般的开发板公司附带的光盘上基本上都附带了编译好的交叉编译器,一般的版本为2.95.3、3.3.2和 3.4.1。2.95.3一般用于编译Linux2.4内核,3.3.2用来编译Linux3.3.2内核的。一般这些编译器都经过测试,而且和配套的开 发板能够很好的吻合,所以初学时基本上不需要配置直接可以使用。当然,由于时间的滞后性,这些编译器往往不是最新的,需要新版本时,往往是催着开发板厂商推出新版本^_^,所以这里我们介绍两种方法来搭建arm-linux调试环境。

方法一:使用现成的交叉编译器
       使用现成的交叉编译器比较简单,一般的开发板都带有几个不同版本的arm-linux工具链,如样创的开发版编译内核用的是3.4.1的版本。
        1.解压工具链到指定目录,以样创的为例。
             ssh登陆后,将arm-linux-gcc-3.4.1.tar.bz2通过ssh自带的文件传输工具传输到Linux,并通过tar命令解压。
           命令如下:
            mkdir /usr/local/arm   //ssh登陆操作必须要有写权限,或者直接以root登陆
            tar -xjvf arm-linux-gcc-3.4.1.tar.bz2 -C /

-C / : 的意识是解压到指定目录,这里指跟目录,由于该压缩包内部的目录结构本身包含usr/local/arm,所以解压到根目录实际上就是把文件解压到/usr/local/arm文件夹下。
        2.环境变量的设置
           设置环境变量,我们可以把刚才的路径生成的路径输出,我们这里使用的是bash配置文件,他的作用是每次登陆或打开shell时自己执行的文件。当然你也可以不用,除非你愿意每次打开的时候都export一下环境变量。
            /etc/bashrc 文件后面加入路径:(如果是ubuntu,修改 /etc/bash.bashrc ,或者/etc/bash.bashrc.local
                  PATH=$PATH:/usr/local/arm/3.4.1/bin
         OK, 在SSH(终端)上输入命令arm-linux-gcc --version,可查看GCC的版本。
arm-linux-gcc.jpg (15.92 KB)
2008-5-14 10:21
         同样的方法可以建立多个版本的工具链,具体使用时修改bash 配置文件即可。
         注:在终端或SSH窗口编辑文件,我们通过VI命令,文件的开发命令为 VI 文件名。
               如,我们要编辑/etc/bashrc的文件,命令为 VI  /etc/bashrc
                      主要用到的几个命令: :q   //不保存退出
                                                          :wq //保存退出
                                                         i      //插入
                                                         ESC  //在命令方式和编辑方式中切换
                    我们需要在bashrc后添加语句 PATH=$PATH:/usr/local/arm/3.4.1/bin的方法为:
                               1.    VI   /etc/bashrc
                               2.    移动光标到文件最后,然后按i键进入插入模式
                               3.    回车后,输入 PATH=$PATH:/usr/local/arm/3.4.1/bin  
                               4.   按ESC键切换到命令模式(如果不知道现在是什么模式可多按几下^_^)
                               5.   按 :qw(注意有冒号),保存退出
                               6.   如果不确定有没有修改成功,可以通过 cat /etc/bashrc 命令查看


方法二:自己搭建新的交叉编译环境
我们可以通过crosstool工具方便的搭建交叉编译环境。crosstool是由美国人Dan Kegel(毕业于加(利福尼亚)州工学院)开发的一套可以自动编译不同匹配版本gcc和glibc,并作测试的脚本程序。
      下载地址http://kegel.com/crosstool/crosstool-0.43.tar.gz        在http://kegel.com/crosstool/crosstool-0.43/buildlogs/ 可以看到各种CPU和GCC+Glibc版本那些已经编译成功,那些部分成功,那些彻底失败。如果你不是编译器开发者,就按着上面做吧。 你也可以到ttp://kegel.com/crosstool/#download 看看是否有更新的版本。          第一步:确认Linux主机有以下几个工具: bison、flex、build-essential 我安装的是Fedora 8,这些工具基本上都有了。         第二步:安装解压crosstool工具                      (SSH以21iee登陆后,将crosstool-0.4.3.tar.gz 直接上传)                    tar -xzvf crosstool-0.43.tar.gz    //解压       第三步:进入crosstool文件夹,可以看到很多.sh 脚本和.dat 配置文件。由于我们采用的开发目标系统为S3C2440,所以我们选用demo-arm9tdmi.sh 。内容如下 #!/bin/sh
# This script has one line for each known working toolchain
# for this architecture. Uncomment the one you want.
# Generated by generate-demo.pl from buildlogs/all.dats.txt
set -ex
TARBALLS_DIR= /home/21iee/arm/source
RESULT_TOP= /home/21iee/arm/crosstool
//TARBALLS_DIR是工具源码压缩包的存放的目录,我们将需要的源码包放这里。
//RESULT_TOP是要生成的工具链的存放目录,需要有写权限,不然无法编译。
export TARBALLS_DIR RESULT_TOP
GCC_LANGUAGES= "c,c++"
export GCC_LANGUAGES
# Really, you should do the mkdir before running this ,
# and chown / opt/ crosstool to yourself so you don
't need to run as root.
mkdir -p $RESULT_TOP

#eval `cat arm9tdmi.dat gcc-3.2.3-glibc-2.2.5.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.2.3-glibc-2.3.2.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.2.3-glibc-2.3.2-tls.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.3.6-glibc-2.2.5.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.3.6-glibc-2.3.2.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.3.6-glibc-2.3.2-tls.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.2.5.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.2.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.2-tls.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.5.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.5-tls.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.6.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.6-tls.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.2.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.2-tls.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.5.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.5-tls.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.6.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.6-tls.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-4.1.0-glibc-2.3.2.dat` sh all.sh --notest
eval `cat arm9tdmi.dat gcc-4.1.0-glibc-2.3.2-tls.dat` sh all.sh --notest

//上面表示要选工具链的版本号!"#"起注释功能!可以选择一行! echo Done.
第四步:下载相应的源码包到${TARBALLS_DIR} 目录中。如上表选用 的是eval `cat arm9tdmi.dat gcc-4.1.0-glibc-2.3.2-tls.dat` sh all.sh --notest ,打开 arm9tdmi.dat gcc-4.1.0-glibc-2.3.2-tls.dat ,其内容如下:   BINUTILS_DIR=binutils-2.16.1
GCC_CORE_DIR=gcc-3.3.6
GCC_DIR=gcc-4.1.0
GLIBC_DIR=glibc-2.3.2
LINUX_DIR=linux-2.6.15.4
LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0
GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.2
GDB_DIR=gdb-6.5
GLIBC_EXTRA_CONFIG="$GLIBC_EXTRA_CONFIG --with-tls --with-__thread --enable-kernel=2.4.18"
到网上去下载红 {MOD}标记的相应版本的.bz2源码包,下载后存放到${TARBALLS_DIR} 目录下。注意:在Windows下有些下载软件下载的bz2包会有问题,建议在IE下直接右键另存为(我用迅雷下的有几个包不能解压,折腾我半天,晕)
最后,进入crosstool-0.43目录,输入./demo-arm9tdmi.sh开始编译。然后差不多可以睡个午觉,如果编译没出错的话,差不多一个小时后在你的toolchains目录中看到你想要的工具链了。
然后把改路径加入到PATH,就可以工作了(方法同上)

作者:hztour  转载请注明出处