交叉编译器的制作
- 格式:doc
- 大小:36.00 KB
- 文档页数:5
交叉编译makefile编写交叉编译Makefile编写在软件开发中,我们通常会遇到需要在不同平台上编译程序的情况。
当我们需要在一台主机上编译运行另一种架构的程序时,就需要进行交叉编译。
而Makefile作为一种构建工具,可以帮助我们自动化编译过程,提高开发效率。
本文将介绍如何编写适用于交叉编译的Makefile,以实现在不同平台上的程序构建。
一、了解交叉编译概念交叉编译是指在一台主机上编译生成另一种架构的可执行文件。
通常情况下,我们在本机上编写并编译程序,然后在本机上运行。
但是,当我们需要在不同的平台上运行程序时,由于不同平台的指令集、库文件等差异,我们就需要使用交叉编译来生成适用于目标平台的可执行文件。
二、Makefile的基本结构Makefile是一种用于描述程序构建过程的文件,它包含了一系列规则(rules),每个规则由一个或多个目标(target)和依赖项(dependencies)组成。
当某个目标的依赖项发生变化时,Make工具会根据规则自动更新目标文件。
一个基本的Makefile结构如下所示:```target: dependenciescommand```其中,target表示目标文件,dependencies表示目标文件的依赖项,command表示生成目标文件的命令。
三、交叉编译的Makefile编写在编写交叉编译的Makefile之前,我们需要了解目标平台的相关信息,如架构、编译器、库文件等。
以ARM架构为例,我们可以使用arm-linux-gnueabi-gcc作为交叉编译器。
我们需要定义一些变量,用于指定交叉编译工具链和相关参数:```CC = arm-linux-gnueabi-gccCFLAGS = -Wall -O2```其中,CC表示编译器,CFLAGS表示编译参数。
接下来,我们可以定义目标文件和依赖项:```TARGET = myprogramSRCS = main.c foo.c bar.cOBJS = $(SRCS:.c=.o)```其中,TARGET表示目标文件,SRCS表示源文件列表,OBJS表示目标文件列表。
GCC交叉编译平台建立过程GCC是一款广泛使用的编译器,在不同的平台上进行交叉编译可以实现在一种平台上开发程序,在另外一种平台上运行程序的目的。
本文将介绍如何建立一个GCC交叉编译平台。
首先,我们需要明确需要建立的交叉编译平台的目标平台和宿主平台。
目标平台是我们希望程序最终运行在的平台,宿主平台是我们用于编译程序的平台。
接下来,我们将按照以下步骤建立一个GCC交叉编译平台:2.配置环境变量:在宿主平台上配置环境变量,使得系统能够找到交叉编译工具链。
通常需要设置PATH变量,将交叉编译工具链的路径添加到其中。
另外,还需要设置一些其他的环境变量,如CC和CXX等,以指定交叉编译器的路径。
3.构建目标平台的一些依赖库:在交叉编译平台上,我们可能需要为目标平台构建一些依赖库。
这些库可以是系统库,也可以是第三方库。
我们需要确保这些库的版本和目标平台的要求相符,并且设置好库的路径和安装目录。
4. 设置构建参数:在交叉编译平台上,我们需要使用特定的构建参数来指定目标平台的一些配置选项。
例如,可以通过--target选项指定目标平台的架构类型,通过--with-arch选项指定目标平台的处理器架构。
5.运行编译命令:在交叉编译平台上,使用GCC交叉编译器来编译程序。
编译命令通常与在宿主平台上的编译命令类似,只是需要使用交叉编译器来代替默认的本地编译器。
需要注意的是,可能需要为程序指定目标平台的一些选项,如目标架构和运行时库等。
6.测试程序和调试:在进行交叉编译时,可能会遇到一些问题,例如链接错误或者运行时错误。
因此,在交叉编译平台上对程序进行测试和调试非常重要。
可以使用目标平台的模拟器或调试器,在交叉编译平台上进行调试。
总结起来,建立一个GCC交叉编译平台需要安装交叉编译工具链,配置环境变量,构建目标平台的依赖库,设置构建参数,运行编译命令,测试程序和调试。
需要注意的是,建立一个可靠的交叉编译平台可能涉及到更多的细节和步骤,具体需要根据不同的目标平台和宿主平台来进行调整和优化。
交叉编译和交叉调试环境搭建及使⽤交叉编译和交叉调试环境搭建及使⽤1. 交叉编译器1.1 交叉编译器介绍在⼀种计算机环境中运⾏的编译程序,能编译出在另外⼀种环境下运⾏的代码,我们就称这种编译器⽀持交叉编译。
这个编译过程就叫交叉编译。
简单地说,就是在⼀个平台上⽣成另⼀个平台上的可执⾏代码,⽽这种⼯具就是交叉编译器(cross compiler)。
1.2 搭建交叉编译环境1.2.1 实验环境交叉编译⼯具:arm-linux- 4.2.2编译平台:ubuntu10.10开发板类型:UT-S3C64101.2.2 搭建步骤1) 在/usr/local/下建⽴交叉编译器的安装⽬录arm:sudo mkdir /usr/local/arm2)将下载的交叉编译器包解压到/usr/local/arm⽬录下:sudo tar jxvf cross-4.2.2-eabi.tar.bz2 -C /usr/local/arm/3)解压成功后,修改PATH环境变量:sudo vim /etc/profile在⽂件为加⼊交叉编译器arm-linux-所在的路径:export PATH=$PATH:/usr/local/arm/4.2.2-eabi/usr/bin然后退出vim。
4) 更新⼀下配置⽂件/etc/profile:source /etc/profile5)检测是否安装成功:现在就可以使⽤交叉编译器了,写⼀个测试程序helloworld,交叉编译下,看是否能在开发板上运⾏。
i. 交叉编译测试程序arm-linux-gcc helloworld.c -o helloworldii.把⽣成的可执⾏⽂件helloworld复制到NFS的挂载⽬录下:sudo cp ./helloworld /nfsboot注意:本实验中开发板使⽤NFS挂载rootfs,nfsboot是NFS的挂载⽬录。
iii.在超级终端上运⾏:./helloworld执⾏结果:2. 交叉调试GDB的介绍和使⽤2.1 GDB是什么?GDB(GNU symbolic debugger) 简单的说是UNIX和LINUX下的⼀个调试⼯具。
交叉编译⼯具链的制作交叉编译⼯具链的制作前⾔及准备本笔记制作的交叉编译⼯具已通过简单验证,对初次有需求需要搭建交叉⼯具链有⼀定的指导意义,制作⼯具链⽐较耗时,需做好花费⼀整天时间的准备。
资料学习链接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 这个环境变量中的原因)。
使用cmake-gui交叉编译CMake是一个跨平台跨编译器的编译工具,它可以简化编译和构建过程。
CMake-GUI是一个基于图形界面的版本,它可以更直观地配置和构建项目。
下面是使用CMake-GUI进行交叉编译的步骤:1. 准备交叉编译环境。
为目标平台准备好交叉编译器,并安装好必要的依赖库,同时建议将交叉编译器路径添加到环境变量中。
2. 安装CMake-GUI。
在Windows下,CMake-GUI可以通过官方网站免费下载并安装。
在Linux下,可以通过包管理器安装,如Ubuntu下通过以下命令安装:```bashsudo apt-get install cmake-qt-gui```3. 创建工程目录。
在交叉编译环境中,创建一个新的项目目录。
使用CMake-GUI时,建议将源代码和构建目录分开存放,创建一个名为"build"的目录作为构建目录。
4. 配置项目。
双击运行CMake-GUI,并打开刚刚创建的工程目录。
在源代码目录和构建目录中分别选择所需的路径。
接着点击"Configure"按钮,选择交叉编译器平台,选择平台后,点击“Finish”按钮开始生成。
在点击"Configure"按钮前,需要注意:- 交叉编译器的路径在Windows和Linux下是不一样的,需要根据实际情况修改;- 如果需要添加自定义的编译选项,可以在"CMakeLists.txt"文件中添加。
5. 构建项目。
在CMake-GUI界面中,设置好编译选项,如编译类型、编译优化级别等。
然后点击"Generate"按钮,开始构建项目。
如果构建成功,我们可以在构建目录中看到生成的二进制可执行文件。
至此,我们使用CMake-GUI完成了交叉编译操作。
需要注意的是,交叉编译的过程可能因环境、依赖库等多种因素出现问题,需要根据具体情况进行调整。
ARM交叉编译链的制作1. 直接下载已经编译好的文件。
例如:,这里提供已经编译好的cross,如cross-3.3.2.tar.bz2,cross-3.0.tar.bz2。
直接下载某个包后解压,然后创建合适的链接或者输出环境变量即可调用。
这种做法操作很简单,但是不能根据自己的需求去定义,只能选择已经编译好的东西。
2. 自己动手利用crosstool来制作。
A. 在CROSSTOOL官方网站下载源码包,解压,进入解压后的目录。
$sudowget /crosstool/crosstool-0.42.tar.gz$sudo tar -xzvf crosstool-0.42.tar.gz$cd crosstool-0.42B. 以ROOT建立目录,存放生成的交叉编译链改变该目录的所有者为普通用户例如,存放生成的交叉编译链目录为/opt/crosstool,如下所示:sudomkdir /opt/crosstoolsudochown $USER /opt/crosstoolC. 修改针对目标板的脚本文件。
$sudovi demo-arm.sh(1)这几个环境变量可以根据实际情况修改TARBALLS_DIR=$HOME/downloadsRESULT_TOP=/opt/crosstoolexport TARBALLS_DIR RESULT_TOPGCC_LANGUAGES="c,c++"export GCC_LANGUAGES(2)在若干行eval语句中选择要建立的交叉编译链的组合,去掉该行eval的#号。
例如要做gcc为3.3.3,glibc为2.3.2的工具链eval `cat arm.dat gcc-3.4.5-glibc-2.3.6.dat` sh all.sh --notestD. 修改目标板脚本文件demo-arm.sh中eval那一行出现的体系结构的配置文件$sudovi arm.datKERNELCONFIG=`pwd`/arm.configTARGET=arm-unknown-linux-gnuTARGET_CFLAGS="-O"可以修改TARGET变量为TARGET=arm-S3C2410-linux-gnu(你的arm型号)E.修改目标板脚本文件demo-arm.sh中eval那一行出现的工具链的匹配文件$sudovi gcc-3.4.5-glibc-2.3.6.datBINUTILS_DIR=binutils-2.15GCC_DIR=gcc-3.3.3GLIBC_DIR=glibc-2.3.2LINUX_DIR=linux-2.4.26GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.2以上变量要根据实际情况修改。
linux交叉编译环境搭建步骤正文:在进行Linux交叉编译之前,我们需要先搭建好相应的交叉编译环境。
下面是搭建步骤的详细说明:步骤一:安装必要的软件包首先,我们需要安装一些必要的软件包,包括GCC、binutils、glibc 以及交叉编译工具链等。
可以通过包管理器来安装这些软件包,比如在Ubuntu上可以使用apt-get命令,CentOS上可以使用yum命令。
步骤二:下载交叉编译工具链接下来,我们需要下载相应的交叉编译工具链。
可以从官方网站上下载已经编译好的工具链,也可以通过源码自行编译得到。
下载好之后,将工具链解压到一个目录下。
步骤三:配置环境变量为了方便使用交叉编译工具链,我们需要将其添加到系统的环境变量中。
可以通过编辑.bashrc文件来实现,添加类似下面的内容:```shellexport CROSS_COMPILE=/path/to/cross-compiler/bin/arm-linux-export ARCH=arm```其中,/path/to/cross-compiler是你下载的交叉编译工具链的路径。
步骤四:测试交叉编译环境在配置好环境变量之后,我们可以通过简单的测试来验证交叉编译环境是否搭建成功。
比如,可以尝试编译一个简单的Hello World程序,并在目标平台上运行。
步骤五:编译其他软件当交叉编译环境搭建成功,并且测试通过之后,我们就可以使用这个环境来编译其他的软件了。
比如,可以使用交叉编译工具链来编译Linux内核、U-Boot引导程序、驱动程序等。
总结:搭建Linux交叉编译环境是进行嵌入式开发的基础工作之一。
在搭建好环境之后,我们可以使用交叉编译工具链来编译适配于目标平台的软件,从而实现在开发主机上进行开发和调试的目的。
[原创]自己动手制作交叉编译工具链(6)第五步编译GCC(第二次)需要时间大概为:1小时配置选项这次是编译完整的GCC,因此第一次disable的一些选项这次可以enable了。
${SOURCE_DIR}/${PACKAGE_GCC}/configure \--build=${HOST} \--host=${HOST} \--target=${TARGET} \--prefix=${RESULT_DIR} \--with-float=soft \--with-cpu=arm920t \--with-tune=arm9tdmi \--enable-languages=c,c++ \--enable-threads=posix \--enable-c99 \--enable-long-long \--enable-shared \--enable-__cxa_atexit \--enable-nls \--disable-libgompmake && make install选项详解-enable-languages=c,c++This option ensures that only the C and C++ compilers are built.--enable-__cxa_atexitThis option allows use of __cxa_atexit, rather than atexit, toregister C++ destructors for local statics and global objects and is essential for fully standards-compliant handling of destructors. It also affects the C++ ABI and therefore results in C++ shared libraries and C++ programs that are interoperable with other Linux distributions.--enable-c99Enable C99 support for C programs.--enable-long-longEnables long long support in the compiler.--enable-threads=posixThis enables C++ exception handling for multi-threaded code.--enable-nls \--disable-libgomp如果不加这一项会出现如下错误:configure: error: Pthreads are required to build libgompmake[1]: *** [configure-target-libgomp] 错误 1make[1]:正在离开目录`/home/hongwang/mktoolchain/build/gcc-4.4.0-2'make: *** [all] 错误 2没有找到好的解决办法,只能在configure里增加--disable-libgomp为什么要编译两次GCC第一遍只编译一个支持c的gcc,原因是要编译出一个支持交叉的c++,必须有一个编译好的用于目标体系平台的glibc,而不是只有glibc的头文件就可以的,好在编译glibc有c支持就够了,所以编译glibc也成了第一遍的gcc唯一的理由和作用。
GCC交叉编译器制作做嵌入式开发少不了跨平台操作,因此也少不了使用交叉编译器,我们可以自己动手制作属于我们自己的交叉编译器,其中可以定制一些东西,可以使之支持浮点运算等特殊要求。
以下以适合嵌入式开发最常用的ARM平台的ARMGCC交叉编译器为例进行讲解:其他平台步骤和方法一样,只需在平台选择的时候作相应更改即可。
准备工作:1.下载制作交叉编译环境的工具:crosstool(crosstool-0.43.tar.gz)使用命令行下载wget /crosstool/crosstool-0.43.tar.gz2.下载编译过程需要用到的源代码:binutils-2.15.tar.bz2gcc-3.4.5.tar.bz2glibc-2.3.6.tar.bz2glibc-linuxthreads-2.3.6.tar.bz2linux-2.6.8.tar.bz2linux-libc-headers-2.6.12.0.tar.bz2说明:具体版本号可以有一些不同,后面说讲如何设置。
以上七个软件建议放在同一目录下,如~/linux/download 目录下。
3.编译过程需要用到以下几个软件,系统本身没有安装,可以运行安装命令提前做好,因为编译一次至少要花半个小时,如果因为依赖软件没有安装中途会报错退出,只有从头再来,那样很浪费时间的。
sudo apt-get install bison flex build-essential patch libncurses5-dev具体工作步骤:1、修改系统配置1.1 将GCC版本设置为4.1Ubuntu 10.04 默认安装的gcc 版本为4.4,这个版本对于语法要求较高,编译会出错,目前不宜选用,于是选择了gcc-4.1,但并不需要卸载gcc-4.4。
sudo apt-get install gcc-4.1sudo rm /usr/bin/gcc (删除GCC,它只是个到gcc-4.3.2的软链接文件)sudo ln -s /usr/bin/gcc-4.1 /usr/bin/gcc (建立GCC到gcc-4.1的软链接)1.2 修改sh版本如果运行ls -la /bin/sh看到链接的是 dash ,则请运行以下命令sudo dpkg-reconfigure dash选择 no 以删除 dash此处如果不改好的话,编译时会出现错误2.解压软件包,并进入该目录,查看重要的脚本文件。
$cd downloads$tar –zxvf crosstool-0.43.tar.gz$cd crosstool-0.43在此目录下可以看到有很多.sh脚本和.dat配置文件,每一个支持的处理器都有它所相应的脚本。
假如选用demo-arm- softfloat.sh 就是建立目标为支持软浮点的arm交叉编译工具链。
3.修改demo-arm-softfloat.sh$vim demo-arm-softfloat.sh修改下面两句TARBALLS_DIR=$HOME/downloads //表示下载的源码的存放目录RESULT_TOP=/opt/crosstools //表示生成的工具链的存放目录为:TARBALLS_DIR=/home/linux/downloads(源码存放目录)RESULT_TOP=/home/linux/crosstools(生成工具链目录)4.修改 gcc-3.4.5-glibc-2.3.6.dat$ vim gcc-3.4.5-glibc-2.3.6.dat修改内容为:BINUTILS_DIR=binutils-2.15GCC_DIR=gcc-3.4.5GLIBC_DIR=glibc-2.3.6LINUX_DIR=linux-2.6.26.5LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.65.$ ./ demo-arm-softfloat.sh这个过程较长(半个小时左右)6.修改环境变量修改环境变量有多种方法我们介绍两种(1)第一种方法:在当前用户目录的.bashrc中添加如下内容$export PATH=$PATH:/home/linux/crosstool/gcc-3.4.5-glibc-2.3.6/arm-softfloat-linux-gnu/bin: (2)第二种方法:或直接修改/home/linux/.bashrccd /home/linuxvim .bashrc添加如下内容:PATH=$PATH:/home/linux/crosstool/gcc-3.4.5-glibc-2.3.6/arm-softfloat-linux-gnu/bin:然后source .bashrc7.执行如下命令$ arm-softfloat-linux-gnu-gcc -v显示Reading specs from /home/david/project/crosstool/gcc-3.4.5-glibc-2.3.6/arm-softfloat-linux-gnu/li b/gcc/arm-softfloat-linux-gnu/3.4.5/specsConfigured with: /home/david/downloads/crosstool-0.43/build/arm-softfloat-linux-gnu/gcc-3.4.5-glibc-2.3.6/gcc-3.4.5/configure --target=arm-softfloat-linux-gnu --host=i686-host_pc-linux-gnu --prefix=/home/david/project/crosstool/gcc-3.4.5-glibc-2.3.6/arm-softfloat-linux-gnu --with-float=s oft --with-headers=/home/david/project/crosstool/gcc-3.4.5-glibc-2.3.6/arm-softfloat-linux-gnu/ar m-softfloat-linux-gnu/include --with-local-prefix=/home/david/project/crosstool/gcc-3.4.5-glibc-2.3.6/arm-softfloat-linux-gnu/arm-softfloat-linux-gnu --disable-nls --enable-threads=posix --enable-symvers=gnu --enable-__cxa_atexit --enable-languages=c,c++ --enable-shared --enable-c99 --ena ble-long-longThread model: posixgcc version 3.4.5ok交叉编译环境创建成功!8.恢复我们修改的系统配置:恢复gcc为4.3sudo rm /usr/bin/gccsudo ln -s /usr/bin/gcc-4.3 /usr/bin/gcc重新安装dashsudo dpkg-reconfigure dash选择 yes 以重新安装 dashThese critical programs are missing or too old这个问题是我在使用UBUNTU 9.10 时遇到的问题。
在使用crosstool0.43生成工具链的时候,系统提示,太旧,,实质上是没有满足,它正则表达式,2.1[3-9]*从这个表达式的含义上看,只能是,2.13-----2.19.。
的as 或者ld 差可以,,,,,ld -v可以查看你当前的版本。
2.20哈哈,,就差0.01.。
改吧,找到文件改了,,,,,但是在重新执行的过程中文件被修改过。
所以,马上意识到应该修改,源码包里的glibc中的configure文件可以看到case $ac_prog_version in'') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;2.1[3-9]*) 《--------------------------------------------3920行ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;*) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;case $ac_prog_version in'') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;2.[1-2][0-9]*) 《--------------------------------------------3920行ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;*) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;还有3981行也有这样的代码。
一个是ld ,,,一个是ar 这样所有的问题就不是问题了,,,,重新运行,,,可以解决了。