由于fedora10自身gcc版本是4.3.0以上版本,在安装我们需要的gcc交叉编译器时出现了不少问题,主要是因为新版本的linux系统下的gcc版本太高,而用crosstool安装时却一直提醒版本too old,其实不是太老,而是太新以至于成人crosstool不识别,本人是linux菜鸟,现在刚开始接触,防止以后遗忘,特做此笔记。
1.1.准备工作。下载需要的lib工具包所示:
binutils-2.16.1.tar.bz2
gdb-6.5.tar.bz2
glibc-2.3.2.tar.bz2
crosstool-0.43.tar.gz
glibc-linuxthreads-2.3.2.tar.bz2
linux-2.6.15.4.tar.bz2
gcc-4.1.0.tar.bz2
gcc-3.3.6.tar.bz2
linux-libc-headers-2.6.12.0.tar.bz2
完以后在放在自己喜欢的位置。本人在/home/zcs/downloads 文件目录,以下以此目录为例。到此位置准备工作已经完成。
2.$cd /home/zcs/downloads //进入downloads
3.$tar -xzvf crosstool-0.43.tar.gz //解压crosstool
4.$vim arm.sh //修改arm.sh
set -ex
TARBALLS_DIR=$HOME/downloads
RESULT_TOP=/opt/crosstool
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.
主要修改第三行,编译出来的工具链目录,本人放在RESULT_TOP=$HOME/crosstool。否则编译时会提醒权限不够,其他不用修改。
第五行有必要解释一下,标示编译的工具链将支持什么语言。可以自行添加,本人用c,c++编程,所以不需要修改。如果需要java,可以添加上去,编译的时候,如果提前没有下载相应的java包,crosstool会自动下载,不过下载速度比较慢。这也我们为什么提前要把编译的工具包提前下载。你可以在第一步的准备工作不需要做,直接就下载一个crosstool工具,解压,开始编译,编译的过程估计需要一,两天,如果网速慢的.
最后一行就是最终编译出来的工具链的版本。#开到头的为注释。 你可以编译多种版本的工具链,只要取消对应前面的#。
5.$vim arm.dat //看看上一步最后一行,用到哪个dat文件。 arm.dat 和gcc-4.10-glibc-2.3.2-tls.dat 修改。
KERNELCONFIG=`pwd`/arm.config
TARGET=arm-unkonwn-linux-gnu
TARGET_CFLAGS="-O"
第二行解释,编译出来的工具链的 编译c,或者c++文件的命令标示,可以修改,也可以不修改。一般修改为arm-linux。
第三行,标示全面优化参数,不用修改。
6.$vim gcc-4.10-glibc-2.3.2-tls.dat //gcc-4.10-glibc-2.3.2-tls.dat 一般不修改默认就可以了。这里显示标示工具链编译所需要的的包文件版本。
7.现在问题出现了,如果直接执行第8步,就会提醒gcc版本too old了,因为默认的gcc是4.3.0,所以我们来下载安装gcc-4.1.0。在download里解压:$tar -xjvf gcc-4.1.0.tar.bz2.然后配置:$./configure 然后再编译:$make 问题又出现了:
make 时出现的问题
WARNING: `makeinfo' is missing on your system. You should only need it if
you modified a `.texi' or `.texinfo' file, or any other file
indirectly affecting the aspect of the manual. The spurious
call might also be the consequence of using a buggy `make' (AIX,
DU, IRIX). You might want to install the `Texinfo' package or
the `GNU make' package. Grab either from any GNU archive site.
make[3]: *** [fastjar.info] 错误 1
make[3]: Leaving directory `/root/mars/software/gcc/fastjar'
make[2]: *** [all] 错误 2
make[2]: Leaving directory `/root/mars/software/gcc/fastjar'
make[1]: *** [all-fastjar] 错误 2
make[1]: Leaving directory `/root/mars/software/gcc'
make: *** [all] 错误 2
解决办法:需要安装textinfo,原因是与系统内的textinfo不匹配,下载一个texinfo-4.9.tar.bz2安装上:解压$tar -xjvf texinfo-4.9.tar.bz2 进入文件$cd texinfo-4.9 配置$./congigure 编译$make 链接$make install。然后在重新回到gcc-4.1.0后,在执行$make $make install.至此gcc编译成功。(期间如果提示权限不够的话,就用$su命令进入根用户执行)。现在用命令 $gcc -v就可以看到现在的gcc版本了。
8.下面再转到crosstool-0.43里面继续执行。$./arm.sh //执行shell文件gcc。开始编译,如果所有包都是提前下载的,静静等待就可以了。
9.$export PATH=/home/zcs/crosstool/gcc-4.1.0-glibc-2.3.2/arm-linux/bin:$PATH //设置环境变量进行测试编译好的工具链是否满意。
10.$vim hello.c //int main(){printf("hello");return 0;}
11.$arm-linux-gcc -o hello hello.c //编译hello.c文件,编译出来的hello为二进制文件。
12.$./hello //运行报错,别急,正确。原因是二进制文件不能直接在pc机上运行。通过samba服务把文件传到板子上试试,显示hello,恭喜你,成功;如果现在pc机上运行程序,请看下面
13.$gcc -o hello hello.c //编译出来的hello可以在pc运行了,显示hello。
交叉编译工具链制作完成。