farsight交叉编译器的制作

合集下载

交叉编译流程

交叉编译流程

交叉编译流程
交叉编译的过程可以分为以下步骤:
1. 选择目标体系结构:确定要交叉编译的目标体系结构,例如不同的硬件平台或操作系统。

2. 安装交叉编译工具链:交叉编译工具链包括交叉编译器、链接器、调试器和库文件等,用于将源代码编译成目标平台可执行程序。

这些工具可以通过官方提供的源代码进行编译,也可以通过第三方工具包进行安装。

3. 配置交叉编译环境:确保系统能够正确地找到和使用交叉编译工具链。

这通常涉及将工具链的路径添加到环境变量中,并在构建系统中设置相应的配置参数。

4. 运行configure命令:进入源码包根目录下,运行configure命令。


命令有很多参数可配置,可以用configure –help来查看,在交叉编译过程中可设置–host、–target、–build这几个参数。

这些参数配置后,configure时会读取源码目录下面的文件,查找、检查设置的参数是否支持。

完成以上步骤后,就可以开始进行交叉编译了。

如果还有其他疑问,建议咨询专业编程人员以获取更全面的信息。

交叉编译树莓派内核教程

交叉编译树莓派内核教程

交叉编译树莓派内核教程以下是一个交叉编译树莓派内核的教程:1. 准备交叉编译工具链:在你的主机上安装交叉编译工具链。

树莓派使用的是ARM架构,所以你需要一个适用于ARM的工具链。

你可以下载一个现成的工具链,也可以从源代码自己构建。

2. 获取树莓派内核源代码:你可以从树莓派官方网站上下载最新的内核源代码。

解压缩源代码到你的主机上的某个目录中。

3. 配置交叉编译环境:在源代码目录中运行以下命令来配置交叉编译环境:```export CROSS_COMPILE=<交叉编译工具链的前缀>export ARCH=arm```4. 配置内核:在源代码目录中运行以下命令来配置内核选项: ```make <树莓派型号>_defconfig```5. 编译内核:运行以下命令来编译内核:```make -j4````-j4`参数指定使用4个线程进行编译,你可以根据你的主机的配置进行调整。

6. 交叉编译模块:如果你需要编译一些内核模块,你可以运行以下命令:```make modules```7. 安装内核:将编译好的内核和模块拷贝到你的树莓派上。

你可以通过将生成的zImage文件拷贝到/boot目录来安装内核。

同时,将生成的设备树文件(.dtb)也拷贝到/boot目录。

8. 配置启动文件:编辑/boot/config.txt文件,将kernel选项指向你编译好的内核文件。

9. 重启树莓派:现在,你可以重启你的树莓派,它将加载你编译好的内核。

这些步骤将帮助您交叉编译树莓派内核。

请注意,这只是一个概述,具体步骤可能会因环境而异。

您可能需要参考更详细的教程或根据您的需求进行自定义配置。

建立交叉编译工具链

建立交叉编译工具链
第18章
建立交叉编译工具链
工欲善其事,必先利其器。嵌入式Linux开发不能缺少 的就是开发工具,其中最基本的是编译工具。和传统的编译 方式不同,嵌入式系统开发需要在不同的计算机上编译出开 发板需要的程序,所用的编译工具也与传统的编译工具不同 。本章讲解如何构建嵌入式Linux开发需要的交叉编译工具 链,主要内容如下: 交叉编译工具链介绍 手工构建交叉编译工具链 使用脚本构建交叉编译工具链 交叉编译工具链常见的问题
18.1
什么是交叉编译
交叉编译是伴随嵌入式系统的发展而来的,传统的程 序编译方式,生成的程序直接在本地运行,这种编译方式称 作本地编译(Native Compilation);嵌入式系统多采用交 叉编译的方式,在本机编译好的程序是不能在本机运行的, 需要通过特定的手段(例如烧写,下载等)安装到目标系统 上执行。这种编译运行的方法比较繁琐,是受到实际条件限 制的。大多数的嵌入式系统目标板系统资源都很有限,无论 是存储空间还是CPU处理能力,都很难达到编译程序的要求 。而且很多目标板是没有操作系统的,需要通过其他的机器 编译操作系统和应用程序。
18.3.6
编译安装glibc库
GNU glibc库是Linux系统程序非常重要的组成部分。 如果用户开发目标平台的应用程序,则必须编译安装glibc库 。glibc-2.3.2版本推荐先安装以下的工具: GNU make 3.79或更新的版本; GCC 3.2或更新的版本; GNU binutils 2.13或更新的版本。
18.3.3
建立linux内核头文件
交叉编译器需要通过内核头文件获取目标平台支持的系 统函数调用的信息。因此,需要拷贝内核的头文件。但是,直 接拷贝内核头文件是不行的,还需要对内核做简单的配置,让 内核脚本生成目标平台的头文件。需要注意的是,Linux内核 版本和编译器版本依赖比较强,一个版本的编译器不能保证编 译所有内核版本。 (1)首先在$PRJROOT/kernel目录下解压缩内核源代码 (2)接下来进入内核代码目录配置目标平台的头文件: (3)Linux内核配置的顶层界面,按照功能划分分成若 干项,与生成目标平台头文件相关的是System Type项。使用 光标键移动到该选项,回车进入配置界面。 (4)目标平台选择完毕后,直接回车,回到了系统类型 配置界面。 (5)配置内核结束后,检查是否生成正确的内核头文件 include/linux/version.h和include/linux/autoconf.h,这两个文件 是编译glibc需要的。以在多种平台上进行,本书建 议使用x86体系结构的PC机,在Linux系统下进行。这种选 择不是强制的,是因为x86体系结构是使用最广泛的。同时 ,使用Linux系统可以避免许多开发环境的设置。建立交叉 编译工具链需要以下的准备: 磁盘空间: 源代码: 命令行: 其他工具:

第4节 交叉开发工具链

第4节  交叉开发工具链

1

本章目标
工具软件的来源 制作交叉编译器 制作件从一开始就使用GNU的工具链。这些 GNU的工具和软件都是开放源码的,可以免费下 载源码编译。
4.1.1 获取相关工具软件 GNU的工具链源码包可以从GNU网站 或者镜像下载。这个站点有很多 GNU软件,其中Linux使用的工具链软件是: BINTUTILS、GCC、GLIBC和GDB。 通过这些软件包,可以生成gcc、g++、ar、as、ld等 编译链接工具,还可以生成glibc库和gdb调试器。 对于交叉开发工具链来说,在文件名字上加一个前 缀,用来区别本地的工具链。 交叉开发工具链就是为了编译、链接、处理和调试 跨平台体系结构的程序代码。
2.LFS(Linux From Scratch) . ( ) LFS就是要指导人们从头开始制作Linux系统。它提供详细的 操作步骤,从源代码开始,一步一步地编译出自己的Linux 系统。 LFS最大的优点是可以按照自己的喜好和需要定制自己的系 统。 LFS 2 LFS第2个优点是可以从更大的程度上控制开发者自己的系统 ,而不依赖于别人打造的工具。 LFS第3个优点是可以建立一个很小的Linux系统。 LFS第4个优点是系统安全性。 CLFS(Cross Linux From Scratch),提供了各种体系结构的 交叉编译方法。 要注意内核与交叉工具链的版本匹配问题,如对于Linux 2.6 内核需要高版本的工具链支持,GCC要求3.3以上版本。
4.2 制作交叉编译器
1. 准备编译环境 选择GCC-3.3.2的版本首先准备编译环境。 创建一个工作目录~/crosstool,把下载的源码包放到 ~/crosstool/source目录下。 接下来下载相关软件包,最好从其官网上下载。 不要忘了下载工具链的补丁。最好下载最新版本的crosstool 软件包,从中可以找到一些有用的东西。 还要准备内核头文件目录。 准备好工作区,创建相关目录。 编译的过程可能会出错,导致编译过程无法继续进行。详 细分析出错信息,有助于解决源码中的语法错误,最好将 编译过程的信息保存在日志文件中便于分析,使用管道命 令:#make 2>&1 | tee crosstool.log。

交叉编译工具链的制作

交叉编译工具链的制作

交叉编译⼯具链的制作交叉编译⼯具链的制作前⾔及准备本笔记制作的交叉编译⼯具已通过简单验证,对初次有需求需要搭建交叉⼯具链有⼀定的指导意义,制作⼯具链⽐较耗时,需做好花费⼀整天时间的准备。

资料学习链接linux⼯具、软件安装的基本步骤:下载,配置,编译,安装crosstool-ng下载或使⽤指令新建 arm-linux-tool ⽂件夹⽤于制作⼯具链mkdir arm-linux-toolcd arm-linux-toolwget /download/crosstool-ng/crosstool-ng-1.23.0.tar.bz2tar -xvjf crosstool-ng-1.23.0.tar.bz2新建mkdir crosstool-build crosstool-install src⼀、安装crosstool-ng1.编译依赖sudo apt-get install gperf flex bison texinfo gawk libtool automake libncurses5-dev g++ help2mangperf是完美哈希函数⽣成器;bison和flex是⽤来⽣成语法和词法分析器;texinfo和man类似,⽤来读取帮助⽂档;automake是帮助⽣成Makefile的⼯具;libtool帮助在编译过程中处理库的依赖关系,⾃动搜索路径;gawk是linux下⽤于⽂本处理和模式匹配的⼯具;2.配置、安装cd crosstool-ng-1.23.0./configure --prefix /home/wangh/workspace/wh_tools/arm-linux-tool/crosstool-install/配置过程中出现的缺少安装项通过安装解决配置正常⽣成 makefile 后,进⾏编译安装makemake install验证安装是否成功在 crosstool-install/bin ⽬录下执⾏ ./ct-ng -v为了后⾯使⽤⽅便,配置临时环境变量export PATH=$PATH:/home/wangh/workspace/wh_tools/arm-linux-tool/crosstool-install/bin/⼆、配置交叉编译⼯具链对于常见的架构,⽐如arm,mips,powerpc等等,都有了很多的,已经帮我验证过,可以正常编译的⽰例配置了,所以我们接下来,主要就是:搞懂⾃⼰借⽤哪个配置,然后调⽤默认配置,然后再确认⼀下配置,根据⾃⼰的情况去改⼀改,就差不多,就配置好了。

交叉编译器的制作

交叉编译器的制作

交叉编译器的制作交叉工具链制作至尊宝典一些必须知道的基础知识Debian 操作系统以及aptitude 命令autoconf and automake什么是交叉编译,configure 的几个参数build host targetbuild:编译代码的机器,的CPU指令集host:编译生成的东西,的CPU指令集(目标板上的CPU的指令集)target:编译生成的东西,他编译生成的的东西,的指令集(所以此选项一般不用,大多只有在做交叉工具链时使用)0、以Expert mode 安装Debian不要升级,确保环境是一个纯净的环境1、声明环境变量1export IS_TARGET=arm-linux1export DIR_SRC=/root/cross_toolchains/src1export PREFIX=/opt/cross_toolchains/arm1export CONFIGURE_BASE="../configure --prefix=$PREFIX --with-sysroot=$PREFIX"2、下载制作交叉工具链所必须的的代码1binutils1ftp:///doc/e613296072.html,/gnu/bi nutils/binutils-2.21.tar.gz1gcc1ftp:///doc/e613296072.html,/gnu/g mp/gmp-5.0.2.tar.gz1ftp:///doc/e613296072.html,/gnu/mpfr/mpfr-3.0.1.tar.gz1/doc/e613296072.html,/mpc/downlo ad/mpc-0.9.tar.gz1ftp:///doc/e613296072.html,/gnu/gc c/gcc-4.6.1/gcc-4.6.1.tar.gz1glibc1ftp:///doc/e613296072.html,/gnu/gli bc/glibc-2.14.tar.gz1ftp:///doc/e613296072.html,/gnu/gli bc/glibc-ports-2.13.tar.gz1linux kernel1/doc/e613296072.html,/pub/linux/k ernel/v2.6/linux-2.6.39.2.tar.bz2 3、安装(卸载)必要的的软件包1aptitude install build-essential automake bison flex texinfo gawk g\+\+1aptitude remove mawk4、解压、归档软件包1cd $DIR_SRC1tar -xf binutils-2.21.tar.gz1tar -xf gmp-5.0.2.tar.gz1tar -xf mpc-0.9.tar.gz1tar -xf mpfr-3.0.1.tar.gz1tar -xf gcc-4.6.1.tar.bz21tar -xf glibc-2.14.tar.gz1tar -xf glibc-ports-2.13.tar.gz1tar -xf linux-2.6.39.2.tar.bz21mv gmp-5.0.2 gcc-4.6.1/gmp1mv mpc-0.9 gcc-4.6.1/mpc1mv mpfr-3.0.1 gcc-4.6.1/mpfr1mv glibc-ports-2.13 glibc-2.14/ports5、编译BINUTILS1cd $DIR_SRC1cd binutils-2.211mkdir build1cd build1$CONFIGURE_BASE --target=$IS_TARGET --disable-nls --enable-shared--disable-multilib1make configure-host1make1make install1export PATH=$PATH:$PREFIX/bin问题:编译binutils一般不会遇到什么问题,但是,如果前面步骤3中安装的软件不全会出现问题6、建立用于编译C库的GCC 1cd $DIR_SRC1cd gcc-4.6.11mkdir build1cd build1$CONFIGURE_BASE \1--target=$IS_TARGET \1--disable-nls \1--disable-shared \1--without-headers \1--with-newlib \1--enable-languages=c \1--disable-threads \1--disable-multilib \1--disable-decimal-float \1--disable-libgomp \1--disable-libmudflap \1--disable-libssp1make all-gcc all-target-libgcc1make install-gcc install-target-libgcc1值得注意的几个configure选项1--target1--disable-shared1--without-headers1--with-newlib1--enable-language-c1--disable-thread1cd $PREFIX/lib/gcc/$IS_TARGET/4.6.11ln -s libgcc.a libgcc_eh.a1有建议修改 gcc/config/t-linux 这个文件1增加-D__gthr_posix_h -Dinhibit_libc 两个宏,但我这里没这样做,是因为:1在configure后,编译使用的命令并不是make 或者是make all 而是 make all-gcc 和 make all-target-libgcc,所以很多问题不会出现1-with-newlib,这个选项不会迫使我们必须使用newlib1libgcc.mvars: No such file or directory1不能在GCC 的源代码目录进行configure,必须在另外的目录进行configure make 等工作1所以这里在代码所在目录下mkdir build 并cd build 再进行 ../configure 等工作1configure: error: C compiler cannot create executables1如果使用 make 或 make all 会出现这样的问题,因为我们还未编译出目标指令集的 C库1所以只能先使用 make all-gcc make all-target-libgcc1../../../../arm-linux/bin/ld: cannot find -lgcc1../../../../arm-linux/bin/ld: cannot find -lgcc_eh1很多资料都只写了make all-gcc 而没有写make all-target-libgcc 这样只建立了gcc,没有建立libgcc.a会出现以上第一个错误1如果没手工建立链接文件 libgcc_eh.a 则会出现第二个错误7、配置内核生成必要的头文件1cd $DIR_SRC1cd linux-2.6.39.21make ARCH=arm CROSS_COMPILE=$IS_TARGET- menuconfig1make ARCH=arm CROSS_COMPILE=$IS_TARGET-1mkdir -p $PREFIX/include1cd $PREFIX/include1ln -s $DIR_SRC/linux-2.6.39.2/arch/arm/include/asm asm 1ln -s $DIR_SRC/linux-2.6.39.2/include/linux linux1ln -s $DIR_SRC/linux-2.6.39.2/include/asm-generic asm-generic1这里并没有将内核的头文件复制到交叉工具链的安装目录1编译C库的时候,需要对应的CPU指令集的汇编代码所以做了链接处理1编译内核在执行make ARCH=arm CROSS_COMPILE=$IS_TARGET- 时如果出错,是没有关系的,这里只要生成了对应的 version.h autoconf.h就可以了8、编译C库1cd $DIR_SRC1cd glibc-2.91mkdir build1cd build1vi ../configure1vi ../ports/sysdeps/unix/sysv/linux/arm/sigrestorer.S1vi ../sysdeps/unix/syscall-template.S1vi ../nptl/allocatestack.c1vi ../elf/dl-tls.c1vi ../sysdeps/ieee754/dbl-64/s_fma.c1vi ../sysdeps/ieee754/dbl-64/s_fmaf.c11具体的修改,我写在下面(觉得还是要说清楚为什么修改,所以就没用sed命令或是做一些patch文件了,请向下看)1CC=$IS_TARGET-gcc \1$CONFIGURE_BASE \1--host=$IS_TARGET \1-enable-add-ons \1--with-binutils=$PREFIX/bin \1--with-headers=$PREFIX/include \1libc_cv_forced_unwind=yes \1libc_cv_c_cleanup=yes1值得注意的几个configure选项1--host1--with-headers1lib_cv_forced_unwind1lib_cv_c_cleanup1make1make install1这里编译的时候并有选择TARGET为EABI,所以在制作交叉工具链时会有很多问题需要修改1*** These critical programs are missing or too old: as ld1*** Check the INSTALL file for required versions.1vi ../configure1查找 "$AS --version" 将 2.1[3-9] 修改为 2.[1-2][0-9]1查询 "$LD --version" 将 2.1[3-9] 修改为 2.[1-2][0-9]1Error: previous CFI entry not closed (missing .cfi_endproc) 1vi ../ports/sysdeps/unix/sysv/linux/arm/sigrestorer.S1ENTRY(__default_sa_restorer) 下增加1END(__default_sa_restorer)1ENTRY(__default_rt_sa_restorer) 下增加1END(__default_rt_sa_restorer)1syscall-template.S:82: Error: CFI instruction used without previous .cfi_startproc1vi ../sysdeps/unix/syscall-template.S1这个问题的修改我也不是十分确定,我是这样来思考的1看到 syscall-template.S 中有 #include1去查看 ports/sysdeps/unix/sysv/linux/arm/sysdep.h1看到如下代码1#ifdef __ASSEMBLER__1#undef PSEUDO11#define PSEUDO(name, syscall_name, args) \1 .text;\1 ENTRY (name);\1 DO_CALL (syscall_name, args); \1 cmn r0, $4096;11猜测是__ASSEMBLER__宏未打开,以至于未能找到PSEUD0函数的声明,则将11#define PSEUDO(name, syscall_name, args) \1 .text;\1 ENTRY (name);\1 DO_CALL (syscall_name, args); \1 cmn r0, $4096;11这段代码添加至 ../sysdeps/unix/syscall-template.S 中1LS_DTV_UNALLOCATED undeclared (first use in this function)1vi ../nptl/allocatestack.c1vi ../elf/dl-tls.c1这个错误会出现在编译以上两个文件的时候,这个宏的定义我grep了整个glibc的所有代码,没找到ARM相关的声明及定义,按照其他指令集的定义猜测着修改如下1在以上两个C文件中增加相应的定义11#define TLS_DTV_UNALLOCATED ((void *) -1l)1E_TOWARDZERO undeclared (first use in this function)1E_INEXACT undeclared (first use in this function)1以上两个错误会出现在以下两个文件的的编译过程中1vi ../sysdeps/ieee754/dbl-64/s_fma.c1vi ../sysdeps/ieee754/dbl-64/s_fmaf.c1参考 ports/sysdeps/arm/eabi/bits/fenv.h中的定义1在两个文件中添加1#define FE_TOWARDZERO 0xc000001#define FE_INEXACT 161mawk: scripts/gen-sorted.awk: line 19: regular expression compile failed1所以要 aptitude install gawk 所以也顺带着 aptitude remove mawk1configure: error: forced unwind support is required1configure 中增加配置参数 libc_cv_forced_unwind=yes1error: the compiler must support C cleanup handlin1configure 中增加配置参数libc_cv_c_cleanup=yes1--enable-add-ons 为 C 库增加 thread 支持,目前默认使用的是 nptl 所以这里没有去下载 glibc-threads 相关的代码1--with-headers 指定内核头文件所在的目录9、编译完整的gcc 工具链1mkdir -p $PREFIX/usr1cd $PREFIX/usr1ln -s ../include include1cd $PREFIX1mkdir -p opt/cross_toolchains1cd opt/cross_toolchains/1ln -s ../../../arm arm1cd $DIR_SRC1cd gcc-4.6.11cd build1make clean1make distclean1rm * -rf1$CONFIGURE_BASE \1--target=arm-linux \1--enable-languages=c,c++ \1--enable-shared \1--disable-nls \1--enable-c99 \1--enable-long-long \1--disable-multilib \1--enable-__cxa_atexit1几个值得注意的configure 选项1--target1--enable-shared1make1make install1The directory that should contain system headers does not exist:1这个问题我没具体的去跟踪了,从表面上看出来是一些路径上的问题,并且经过验证,这个问题是在configure时使用了--with-sysroot选项时产生的1为了尝试不通过建立链接的方式去解决这个问题1在指明了 --includedir --libdir --sysconfdir 等等一系列参数后编译,依然会出现此问题1所以不再跟踪,暂且是当做GCC编译环境上的一个 BUG好了1/opt/cross_toolchains/arm/arm-linux/bin/ld: cannot find/opt/cross_toolchains/arm/lib/libc.so.6 inside /opt/cross_toolchains/arm 1这个问题更是有点神经病了,所以这里也不跟踪了,也是由于使用了 --with-sysroot选项产生的问题,建立了第二个链接文件1目的是让 /opt/cross_toolchains/arm 这个被当做是根目录的目录里面能有一个跟--prefix 指定的/opt/cross_toolchains/arm 一样的目录结构(说起来真别扭)参考资料https:///doc/e613296072.html,/devel operworks/cn/linux/l-embcmpl//doc/e613296072.html,/view/clfs-embedded/arm/cross-tools/introduction.html/doc/e613296072.html,/bbs/showthre ad.php?t=267672(这个文章虽然有点老,也有点神,把一些能看懂的说的让人看不懂,那个图更是让人觉得,汗,但原理还是说的很清楚的,这里强调的--with-sysroot的3次出现的问题,还是值得仔细想想的,这也是我为什么将--with-sysroot 选项做到$CONFIGURE_BASE 这个环境变量中的原因)。

交叉编译程序

交叉编译程序

交叉编译程序
交叉编译是指在一台平台上编译出在其他平台上运行的程序。

常见的情况是在PC上编译出在嵌入式设备上运行的程序。

交叉编译的过程需要以下几步:
1. 配置交叉编译环境:首先需要为目标平台配置交叉编译工具链,即包含目标平台的编译器、链接器、库文件等的工具集。

这些工具通常由平台提供商提供,也可以通过第三方工具链来获取。

2. 修改程序代码:由于目标平台与编译平台的环境差异,需要根据目标平台的特性进行适配。

可能涉及到改变代码中使用的库、修改与硬件相关的代码等。

3. 编译程序:使用交叉编译工具链编译修改后的程序代码。

编译过程与普通的编译过程类似,只是使用的编译器、链接器等是交叉编译工具链中的版本。

4. 运行程序:将编译得到的可执行文件或库文件拷贝到目标平台上,然后在目标平台上运行。

交叉编译的好处是可以在开发阶段使用一台具备较强计算能力的机器进行编译,节省了在嵌入式设备上编译所需的时间。

同时还可以享受到开发环境的便利,如调试工具、IDE等。

不过交叉编译也会带来一些挑战,如环境适配、库依赖等问题需要解决。

海思平台freetype2+SDL2+SDL2_ttf交叉编译

海思平台freetype2+SDL2+SDL2_ttf交叉编译

海思平台freetype2+SDL2+SDL2_ttf交叉编译 海思芯⽚在做OSD⽂字⽔印的时候,⽐如时间戳,⼀般都会使⽤freetype2+SDL2+SDL2_ttf等开源库来⽣成位图进⾏填充,记录⼀下本次交叉编译过程。

1. 下载个⼈喜欢找最新的库,所以三个开源库都是⽤的⽬前最新的版本freetype-2.10.4:SDL2-2.0.14:SDL2_ttf-2.0.15:1. 编译⾸先编译freetype,注意需要指定--enable-freetype-config,在编译SDL2_ttf的时候需要⽤到配置./configure --prefix=$PWD/.. CC=arm-himix100-linux-gcc CXX=arm-himix100-linux-g++ --host=arm-linux --without-zlib --enable-freetype-config编译并安装make -j20 && make install然后编译SDL2配置./configure --prefix=$PWD/.. CC=arm-himix100-linux-gcc CXX=arm-himix100-linux-g++ --host=arm-linux --disable-alsa --disable-pulseaudio --enable-esd=no编译并安装make -j20 && make install最后编译SDL2_ttf,注意需要指定FT2_CONFIG(freetype2的安装配置⽂件)和PKG_CONFIG_PATH(包配置搜索路径)配置./configure --prefix=$PWD/.. CC=arm-himix100-linux-gcc CXX=arm-himix100-linux-g++ --host=arm-linux --with-sdl-prefix=$PWD/.. --with-sdl-exec-prefix=$PWD/.. FT2_CONFIG=$PWD/../bin/freetype-config PKG_CONFIG_PATH=$PWD/../lib/pkgc 编译并安装make -j20 && make install如果编译顺利的话,会在上⼀层路径⽣成include和lib等⽂件夹,可以在项⽬中直接引⽤。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

交叉编译器的制作
平台:Ubuntu-9.10,VMware
注意:crosstool安装过程中只能使用普通用户,如果当前用户为root,则先切换到普通用

1、工具的安装
为防止工具缺失,先安装一些常用的软件包
$sudo apt-get install bison flex build-essential patch libncurses5-dev
/*****************************************
* bison 词法分析器
* flex 语法解析器
* patch打包工具
* libncurses5-dev 终端字符图形库
* build-essential c语言开发包,包含gcc,make,
*gdb,libc函数库等
*****************************************/
2、降低gcc版本
Ubuntu_9.10默认安装的gcc版本为4.4,对语法要求较高,编译会出错。

选择安装gcc-
4.1。

$sudo apt-get install gcc-4.1
/* 安装gcc-4.1 */
$sudo mv /usr/bin/gcc /usr/bin/gcc_backup
/* /usr/bin/gcc是指向gcc-4.4的软链接,备份/usr/bin/gcc */
$sudo ln -s /usr/bin/gcc-4.1 /usr/bin/gcc
/* 建立指向gcc-4.1的软链接/usr/bin/gcc */
3、修改sh版本
运行命令
$ls -la /bin/sh
如果看到链接的是dash,则运行以下命令
$sudo dpkg-reconfigure dash
选择no删除dash
4、用crosstool生成工具链
这里假设家目录为:/home/linux
$mkdir /home/linux/downloads
/* downloads目录用于存放源代码*/
$mkdir /home/linux/crosstool
/* crosstool目录用于存放生成的交叉编译工具*/
将以下源码包复制到downloads目录中(如果downloads中没有这些源码包,编译时crosstool会自动下载)
binutils-2.15.tar.bz2
gcc-3.4.5.tar.bz2
glibc-2.3.6.tar.bz2
glibc-linuxthreads-2.3.6.tar.bz2
linux-2.6.22.6.tar.bz2
linux-libc-headers-2.6.12.0.tar.bz2
将crosstool源码包crosstool-0.43.tar.gz复制到downloads目录中
$cd /home/linux/downloads
/* 进入downloads目录*/
$tar -zxyf crosstool-0.43.tar.gz
/* 解压软件包*/
$cd crosstool-0.43
/* 进入crosstool-0.43目录*/
此目录下有许多.sh脚本和.dat配置文件,每一个支持的处理器都有对应的脚本。

demo-arm-softfloat.sh用于建立支持软浮点的arm交叉编译工具链。

修改demo-arm-softfloat.sh脚本

TARBALLS_DIR=$HOME/downloads
RESULT_TOP=/opt/crosstool
修改为
TARBALLS_DIR=/home/linux/downloads (源码存放目录)
RESULT_TOP=/home/linux/crosstool (生成的工具链存放的目录)
修改gcc-3.4.5-glibc-2.3.6.dat配置文件
BINUTILS_DIR= binutils-2.15
GCC_DIR= gcc-3.4.5
GLIBC_DIR= glibc-2.3.6
LINUX_DIR= linux-2.6.22.6
LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0
GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.6
以上条目表示我们要使用的源码包的版本,这些源码包版本要和我们复制到downloads 下的源码包的版本一致
执行脚本,生成工具链,这个过程比较费时
$./demo-arm-softfloat.sh
出现错误:
These critical programs are missing or too old: as ld
/***************************************************
* 工具as,ld在包binutils中。

可以用命令ld –v和sudo as –v
* 来查看ld和as的版本,Ubuntu-9.10中的ld和as均为2.20,
* 而crosstool-0.43不支持2.20以上的版本,所以要降低版本。

* 可到/gnu/binutils/下载binutils的2.18版本。

*****************************************************/
$cd binutils-2.18
/* 进入binutils所在的目录*/
$./configure --prefix=/tmp/binutils --disable-nls
/* --prefix后面的是生成的可执行文件存放的位置*/
$make all
$make install
/* 编译成功后在/tmp/binutils/bin/中就生成了ld,as程序的可执行文件*/
$sudo mv /usr/bin/ld /usr/bin/ld_backup
/* 备份2.20版本的ld */
$sudo mv /usr/bin/as /usr/bin/as_backup
/* 备份2.20版本的as */
$sudo ln -s /tmp/binutils/bin/ld /usr/bin/ld
/* 建立到1.8版本ld的软链接*/
$sudo ln -s /tmp/binutils/bin/as /usr/bin/as
/* 建立到1.8版本as的软链接*/
/* 这时可再次查看ld和as的版本,显示1.8 */
$./demo-arm-softfloat.sh
/* 再次运行脚本,完成安装*/
修改环境变量
$sudo vim /etc/bash.bashrc
在文件末尾加上:
export PATH=$PATH:/home/linux/crosstool/gcc-3..4.5-glibc-2.3.6/arm-softfloat-linux-gnu/bin: 5、检查安装结果
重新打开一个终端,执行
$arm-softfloat-linux-gnu-gcc -v
如果能显示版本和配置等信息,则说明安装成功
6、恢复为原先的配置
恢复ld,as
$sudo mv /usr/bin/as_backup /usr/bin/as
$sudo mv /usr/bin/ld_backup /usr/bin/ld
恢复gcc
$sudo mv /usr/bin/gcc_backup /usr/bin/gcc
重新安装dash
$sudo dpkg-reconfigure dash
选择yes重新安装
参考资料:
U-BOOT编译中的软浮点soft-float问题
/571209683/blog/item/f7884682d446e2d99023d9e2.html。

相关文档
最新文档