利用Crosstool-ng制做交叉编译工具链

一、什么是crosstool-nglinux

crosstool-ng,全称是crosstool Next Generation,即下一代crosstool,即crosstool的升级版。那么什么是crosstool 呢?crosstool,是个交叉编译器的制做工具。交叉编译器简单的说能够理解为在X86电脑上编译处ARM的运行程序。更详细的介绍能够参考《构建嵌入式LINUX系统》的第四章。web

二、制做交叉编译工具链的步骤bash

a、从网址 http://crosstool-ng.org/download/crosstool-ng/下载相应版本的crosstool-ng工具,我下载的版本是crosstool-ng-1.20.0.tar.bz2。如有补丁也须要同时下载,网址为http://crosstool-ng.org/download/crosstool-ng/01-fixes/网络

b、解压crosstool-ng-1.20.0.tar.bz2。命令为tar xjf crosstool-ng-1.20.0.tar.bz2。解压后获得一个名为crosstool-ng-1.20.0的文件夹。输入命令cd crosstool-ng-1.20.0进入文件夹,若是有兴趣能够看下README文件,它会教你一步步制做交叉编译工具链。另外doc文件夹下有详细的制做步骤能够参考。架构

c、配置、编译安装crosstool-ng-1.20.0。步骤:进入crosstool-ng-1.20.0文件夹,执行./configure --prefix=/work/tools/crosstool-ng命令配置crosstool-ng-1.20.0,/work/tools/crosstool-ng为crosstool-ng-1.20.0的安装路径。若配置过程当中出现错误,通常是缺乏某个程序形成的,缺什么安装什么就能够了。通常须要安装的程序为 sudo apt-get install sed bash cut dpkg-dev bison flex patch texinfo automake m4 libtool stat cvs websvn tar gzip bzip2 lzma readlink libncurses5-dev bison flex texinfo automake libtool patch gcj cvs cvsd gawk。配置成功后执行make命令编译,而后make install进行安装。若是后面出现编译错误,再增长相应的包便可。安装完成后能够执行export PATH=$PATH:/work/tools/crosstool-ng/bin。把ct-ng命令放到环境变量中,这样就能够在任何地方执行ct-ng了。为了测试是否安装成功能够输入ct-ng --help命令测试。就出现相应的说明就说明安装成功了。svn

d、配置工具链选项。步骤:将crosstool-ng源码包中samples/arm-unknown-linux-gnueabi/下的crosstool.config拷贝到源码包主目录下,在源码包主目录下执行cp samples/arm-unknown-linux-gnueabi/crosstool.config .config;工具

而后执行:ct-ng menuconfig能够看到以下的配置画面
进入Paths and misc options -- →菜单,修改内容以下:
1)、(${HOME}/src) Local tarballs directory # 指定制做编译器所须要的源码包的下载存放,能够修改为任意位置,请注意权限。如今指定到/work/tools/crosstool-ng-1.20.0/src 下。
2)、(/opt/${CT_TARGET}) Prefix directory # 制做好的编译器所放置的目录。如今指定到/work/tools/crosstool-ng_build下。
3)、选择Debug crosstool-NG,会多出一个子菜单,选中Save intermediate steps,此选项提供一个从上一步错误的地方继续编译,而不是重新编译,这样节约大量的时间。选择(3)Number of parallel jobs(NEW),这个菜单须要下拉才能看到此项为增长编译时的并行进程数,以增长运行速度,加速编译。

进入target options -- →菜单,修改的内容以下:测试

1)、确认Target Architecture (arm) ---> # 注意看这项是否是ARM平台flex

2)、ARMv4t 表示编译出的编译器支持ARMv4t架构的cpu;ARM920t 为指定cpu的类型,S3C2440使用的CPU核心为ARM920t。经过查找资料,这个应该是指令集的架构,对于S3C2410/S3C2440,都ARM920T的核心,架构指令是armv4t,因此,若是要编译2410/2440的,就选armv4t。以此类推S3C6410 ARM1176JZF-S核心使用的是armv6架构,就选armv6。能够经过./arm-linux-gcc --target查看架构。ui

进入Toolchain option-- →菜单,修改的内容以下:

1)、Tuple's vendor string指定经销商的名称,影响向生成的编译器的前缀为arm-andy-Linux-gnueabi;Tuple's alias是生成编译器别名,可使用arm-linux-gcc简洁的命令

进入Operating System --->菜单。选择编译的内核版本。这里使用默认的参数

进入Binary utilities --->选择binutils的源码包版本号,配置二进制工具。这里使用默认参数。

C-library --->菜单,选择glibc库版本,使用默认参数

C compiler --->菜单选择GCC版本,选择默认参数

Debug facilities --->菜单,选择调试工具版本,默认参数。

Companion libraries --->菜单,编译工具,GMP是实现任意精度算术运算的软件包,能够完成有符号整数、有理数和浮点数的运算。只要计算机的内存知足需求,GMP的运算精度没有任何限制。MPFR是一个用于高精度浮点运算的C库。默认参数

接着保存退出。配置完成。

e、下面就能够开始编译了,默认状况下,源码包会从网络下载,会占用比较大的带宽,下载后总大小在200MB左右,下载好会放到 /work/tools/crosstool-ng-1.20.0/src下。也能够先从网上下载,大部分软件能够在这个清华镜像下载:https://mirrors.tuna.tsinghua.edu.cn,而后再编译。也能够先编译,若是缺乏相应的包下载不成功,会提示。大体的包列表以下:

binutils-2.22.tar.bz2

cloog-0.18.1.tar.gz

dmalloc-5.5.2.tgz

duma_2_5_15.tar.gz

expat-2.1.0.tar.gz

gcc-4.9.1.tar.bz2

gdb-7.8.tar.gz

glibc-2.19.tar.bz2

gmp-5.1.3.tar.xz

isl-0.12.2.tar.bz2

libelf_0.8.13.orig.tar.gz

linux-3.4.97.tar.gz

ltrace_0.7.3.orig.tar.bz2

mpc-1.0.2.tar.gz

mpfr-3.1.2.tar.xz

ncurses-5.9.tar.gz

strace-4.8.tar.xz

 

f、执行ct-ng build开始编译,我在编译过程当中一共遇到两个问题。

1)、安装到cross-gdb时,出现configure: error: expat is missing or unusable,expat-2.1.0.tar.gz这个文件是运行build时它本身下载的。解决:sudo apt-get install libexpat1-dev.

2)、解决完问题1后执行ct-ng cross-gdb+能够接着前面的编译。又出现了_123136.c:835:15: error: expected ')' before 'int'的错误。在网上搜寻答案。解决:export CPPFLAGS="-P"。

 

g、最后编译成功界面以下,切换到编译后的路径/work/tools/crosstool-ng_build/bin。执行./arm-linux-gcc -v。如有信息输出,说明编译成功

 

h、测试编译后的arm程序。未完待续。

相关文章
相关标签/搜索