交叉编译_交叉编译器 - CSDN
精华内容
参与话题
  • 一、交叉编译简介 1、什么是交叉编译 1.1 本地编译  解释什么是交叉编译之前,先要明白一个概念:本地编译  我们之前常见的软件开发,都是属于本地编译:在当前的PC下,x86的CPU下,直接编译出来程序,可以运行的...

    一、交叉编译简介

    1、什么是交叉编译

    1.1 本地编译

            解释什么是交叉编译之前,先要明白一个概念:本地编译

           我们之前常见的软件开发,都是属于本地编译:在当前的PC下,x86的CPU下,直接编译出来程序,可以运行的程序(或者库文件),其可以直接在当前的环境,即x86的CPU下,当前电脑中,运行。

          此时的编译,可以叫做,本地编译即在当前目标平台下,编译出来的程序,也只是放到当前平台下,就可以运行的

    2.2 交叉编译

           交叉编译,是一个和,本地编译,相对应的概念。

           而所谓的,交叉编译,就是在一种平台上编译,编译出来的程序,是放到别的平台上运行即编译的环境,和运行的环境不一样,属于交叉的,此所谓cross

            交叉编译,这个概念,主要和嵌入式开发有关。

    例 1.1. 在x86平台上编译,在ARM平台上运行
    一种最常见的例子就是:
    在进行嵌入式开发时
    手上有个嵌入式开发板,CPU是arm的
    然后在x86的平台下开发,比如Ubuntu的Linux,或者是Win7
    然后就需要:
    在x86的平台上,(用交叉编译器)去编译你写好的程序代码
    编译生成的(可执行的)程序,是放到目标开发板,arm的CPU上运行的
    此所谓:在x86平台上编译,在ARM平台上运行
    

    交叉编译,英文常写作cross compile,也有其他写法:crosscompile, cross compiling等


    2、为何要有交叉编译

           之所以要有交叉编译,主要原因是:嵌入式系统中的资源太少

           具体的解释就是:交叉编译出来的程序,所要运行的目标环境中,各种资源,都相对有限,所以很难进行直接的本地编译

           最常见的情况是:在进行嵌入式开发时,目标平台,即嵌入式开发板,比如是最大主频200MHz的ARM的CPU,加上32M的RAM,加上1G的Nand Flash等等。在如此相对比较紧张的硬件资源的前提下,在已经运行了嵌入式Linux的前提下,是没法很方便的直接在嵌入式Linux下,去本地编译,去在ARM的CPU下,编译出来,供ARM的CPU可以运行的程序的。因为编译,开发,都需要相对比较多的CPU,内存,硬盘等资源,而嵌入式开发上的那点资源,只够嵌入式(Linux)系统运行的,没太多剩余的资源,供你本地编译。

    BusyBox中包含make等和编译开发相关的工具
    对应的,等你后期熟悉了嵌入式开发,熟悉了Busybox后,
    比如在Buildroot中去配置Busybox,或者单独交叉编译BusyBox时:
    【记录】Ubuntu下为QEMU的arm平台交叉编译BusyBox
    就会看到,后来的BusyBox,功能增加后,也已经包含了一些,和编译开发相关的工具,比如make等等
    而这些工具,本来的话,只是,放在PC端使用,即在x86平台下做开发的时候,在交叉编译的时候,才用到的工具,
    现在,也在(BusyBox的)嵌入式环境中,支持了。
    此时,如果,你在BusyBox中把相关的开发工具都选上的话,
    再加上,你的目标开发板的硬件配置足够强大的话,比如CPU都是以GHz为单位,等等
    加上相关的开发的库和工具都很全的话
    实际上,至少理论上,也是可以在你的嵌入式Linux中,进行,有限的,甚至是很大程度上的,本地开发
    即,直接在ARM的开发板上,嵌入式Linux中,直接进行嵌入式开发,进行针对ARM的本地编译
    比如,编译出一个helloworld,估计还是可以的
    这样,就不存在,或者说,避免了,此处所说的,交叉编译,而变成了本地编译
    就相当于,之前在x86的PC端的,编译程序放在x86的CPU上运行的本地编译,
    在ARM的CPU,嵌入式Linux中,也实现了
    但是很明显,对于更加复杂的程序或者库,在ARM开发板上直接编译的可行性和效率,相对就很低
    而且如果是本身折腾Uboot等东西,本身目标运行环境,就没有完整的(嵌入式Linux)系统的话,那么就更加没法在目标平台实现本地编译了。
    则还是只能进行,此处所说的,交叉编译


    二、交叉工具链简介

    1、什么是工具链

    所谓的工具链,两部分的含义:

    a -- 工具

           工具,即tool

           工具,是用来干活的;此处要干的活,目标是为了:生成(可以运行的)程序或库文件

    而为了达成此目标,内部的执行过程和逻辑主要包含了:

    1)、编译

            编译的输入(对象)是:程序代码

            编译输出(目标)是:目标文件

            编译所需要的工具是:编译器

            编译器,常见的编译器,即为gcc

    2)、链接

            链接的输入(对象)是:(程序运行时所依赖的,或者某个库所依赖的另外一个)库(文件)

            链接的输出(目标)是:程序的可执行文件,或者是可以被别人调用的完整的库文件

            链接所需要的工具是:链接器

            链接器,即ld

            即,此处,为了将程序代码,编译成可执行文件,涉及到编译,链接(等其他步骤),要依赖到很多相关的工具,最核心的是编译器gcc,链接器ld。而此处,所谓的工具,主要指的就是:和程序编译链接等相关的gcc,ld等工具

    binutils包含了ld等工具
    实际上,上面所说的ld,只是处理操作目标文件,二进制文件的最主要的一个工具
    而和操作目标等文件相关的,还有其他很多工具的:as,objcopy,strip,ar等等工具的
    所以,对此,GNU官网,弄出一个binutils,即binary utils,二进制工具(包),集成了这些,和操作二进制相关的工具集合,叫做binutils
    所以,之后你所见到的,常见的工具,就是那个著名的GNU Binutils了。
    


    b -- 链

           链,即链条,chain

           之所以能称为链,你是说明不止一个东西,然后,按照对应的逻辑,串在一起,链在一起。而对应的,涉及到的:

    不止一个东西:指的是就是前面所说的那个工具,即:和程序编译链接等相关的gcc,binutils等工具

    按照对应的逻辑:指的就是,按照程序本身编译链接的先后顺序,即:先编译,后链接,再进行后期其他的处理等等,比如用objcopy去操作相应的目标文件等等

          如此的,将:

          和程序编译链接等相关的gcc,binutils等工具按照先编译后链接等相关的编译程序的内在逻辑串起来,就成了我们所说的:工具链


    2、什么是交叉工具链

           普通所说的,工具链指的是当前自己的本地平台的工具链

           用于交叉编译的工具链,就叫做交叉工具链。即那些工具,即编译的gcc,链接的ld,以及相关的工具,用于交叉编译的,工具链,叫做交叉工具链。

           交叉工具链,很明显,是用来,交叉编译,跨平台的程序所用的。交叉工具链,和(本地)工具链类似,也是包含了很多的,对应的工具,交叉编译版本的gcc,ld,as等等。但是,由于其中最最主要的是用于编译的gcc,所以,我们也常把:交叉工具链,简称为交叉编译器

           即严格意义上来说,交叉编译器,只是指的是交叉编译版本的gcc。但是实际上为了叫法上的方便,我们常说的交叉编译器,都是指的是交叉工具链。常说的交叉编译版本的gcc,比如arm-linux-gcc,实际上指代了,包含一系列交叉编译版本的交叉工具链(arm-linux-gcc,arm-linux-ld,arm-linux-as等等)而此文中,后面,所说的,如无特殊指明,均用交叉编译器指代交叉工具链。


    总结:

           交叉编译就是在一种平台上编译出能运行在体系结构不同的另一种平台上的程序,比如在PC平台(X86 CPU)上编译出能运行在以ARM为内核的CPU平台上的程序,编译得到的程序在X86 CPU平台上是不能运行的,必须放到ARM CPU平台上才能运行,虽然两个平台用的都是Linux系统。 交叉编译工具链是一个由编译器、连接器和解释器组成的综合开发环境,交叉编译工具链主要由binutils、gcc和glibc三个部分组成。有时出于减小 libc 库大小的考虑,也可以用别的 c 库来代替 glibc,例如 uClibc、dietlibc 和 newlib。



    展开全文
  • 交叉编译详解 一 概念篇

    万次阅读 多人点赞 2017-01-07 22:20:30
    本文总结了什么是交叉编译链,并介绍了交叉编译链的各个组成部分

    第 1 章 交叉编译简介

    1.1 什么是交叉编译

    对于没有做过嵌入式编程的人,可能不太理解交叉编译的概念,那么什么是交叉编译?它有什么作用?

    在解释什么是交叉编译之前,先要明白什么是本地编译。

    本地编译

    本地编译可以理解为,在当前编译平台下,编译出来的程序只能放到当前平台下运行。平时我们常见的软件开发,都是属于本地编译:

    比如,我们在 x86 平台上,编写程序并编译成可执行程序。这种方式下,我们使用 x86 平台上的工具,开发针对 x86 平台本身的可执行程序,这个编译过程称为本地编译。

    交叉编译

    交叉编译可以理解为,在当前编译平台下,编译出来的程序能运行在体系结构不同的另一种目标平台上,但是编译平台本身却不能运行该程序:

    比如,我们在 x86 平台上,编写程序并编译成能运行在 ARM 平台的程序,编译得到的程序在 x86 平台上是不能运行的,必须放到 ARM 平台上才能运行。

    1.2 为什么会有交叉编译

    之所以要有交叉编译,主要原因是:

    • Speed: 目标平台的运行速度往往比主机慢得多,许多专用的嵌入式硬件被设计为低成本和低功耗,没有太高的性能
    • Capability: 整个编译过程是非常消耗资源的,嵌入式系统往往没有足够的内存或磁盘空间
    • Availability: 即使目标平台资源很充足,可以本地编译,但是第一个在目标平台上运行的本地编译器总需要通过交叉编译获得
    • Flexibility: 一个完整的Linux编译环境需要很多支持包,交叉编译使我们不需要花时间将各种支持包移植到目标板上

    1.3 为什么交叉编译比较困难

    交叉编译的困难点在于两个方面:

    不同的体系架构拥有不同的机器特性

    • Word size: 是64位还是32位系统
    • Endianness: 是大端还是小端系统
    • Alignment: 是否必修按照4字节对齐方式进行访问
    • Default signedness: 默认数据类型是有符号还是无符号
    • NOMMU: 是否支持MMU

    交叉编译时的主机环境与目标环境不同

    • Configuration issues:
    • HOSTCC vs TARGETCC:
    • Toolchain Leaks:
    • Libraries:
    • Testing:

    详细的对比可以参看这篇文章,已经写的很详细了,在这就不细说了:Introduction to cross-compiling for Linux

    第 2 章 交叉编译链

    2.1 什么是交叉编译链

    明白了什么是交叉编译,那我们来看看什么是交叉编译链。

    首先编译过程是按照不同的子功能,依照先后顺序组成的一个复杂的流程,如下图:

    编译流程

    那么编译过程包括了预处理、编译、汇编、链接等功能。既然有不同的子功能,那每个子功能都是一个单独的工具来实现,它们合在一起形成了一个完整的工具集。

    同时编译过程又是一个有先后顺序的流程,它必然牵涉到工具的使用顺序,每个工具按照先后关系串联在一起,这就形成了一个链式结构。

    因此,交叉编译链就是为了编译跨平台体系结构的程序代码而形成的由多个子工具构成的一套完整的工具集。同时,它隐藏了预处理、编译、汇编、链接等细节,当我们指定了源文件(.c)时,它会自动按照编译流程调用不同的子工具,自动生成最终的二进制程序映像(.bin)。

    注意:严格意义上来说,交叉编译器,只是指交叉编译的gcc,但是实际上为了方便,我们常说的交叉编译器就是交叉工具链。本文对这两个概念不加以区分,都是指编译链

    2.2 交叉编译链的命名规则

    我们使用交叉编译链时,常常会看到这样的名字:

    arm-none-linux-gnueabi-gcc
    arm-cortex_a8-linux-gnueabi-gcc
    mips-malta-linux-gnu-gcc
    

    其中,对应的前缀为:

    arm-none-linux-gnueabi-
    arm-cortex_a8-linux-gnueabi-
    mips-malta-linux-gnu-
    

    这些交叉编译链的命名规则似乎是通用的,有一定的规则:

    arch-core-kernel-system
    
    • arch: 用于哪个目标平台。
    • core: 使用的是哪个CPU Core,如Cortex A8,但是这一组命名好像比较灵活,在其它厂家提供的交叉编译链中,有以厂家名称命名的,也有以开发板命名的,或者直接是none或cross的。
    • kernel: 所运行的OS,见过的有Linux,uclinux,bare(无OS)。
    • systen:交叉编译链所选择的库函数和目标映像的规范,如gnu,gnueabi等。其中gnu等价于glibc+oabi;gnueabi等价于glibc+eabi。

    注意:这个规则是一个猜测,并没有在哪份官方资料上看到过。而且有些编译链的命名确实没有按照这个规则,也不清楚这是不是历史原因造成的。如果有谁在资料上见到过此规则的详细描述,欢迎指出错误。

    第 3 章 包含的工具

    3.1 Binutils

    Binutils是GNU工具之一,它包括链接器、汇编器和其他用于目标文件和档案的工具,它是二进制代码的处理维护工具。

    Binutils工具包含的子程序如下:

    • ld GNU连接器the GNU linker.
    • as GNU汇编器the GNU assembler.
    • addr2line 把地址转换成文件名和所在的行数
    • ar A utility for creating, modifying and extracting from archives.
    • c++filt Filter to demangle encoded C++ symbols.
    • dlltool Creates files for building and using DLLs.
    • gold A new, faster, ELF only linker, still in beta test.
    • gprof Displays profiling information.
    • nlmconv Converts object code into an NLM.
    • nm Lists symbols from object files.
    • objcopy Copys and translates object files.
    • objdump Displays information from object files.
    • ranlib Generates an index to the contents of an archive.
    • readelf Displays information from any ELF format object file.
    • size Lists the section sizes of an object or archive file.
    • strings Lists printable strings from files.
    • strip Discards symbols

    binutils介绍

    3.2 GCC

    GNU编译器套件,支持C, C++, Java, Ada, Fortran, Objective-C等众多语言。

    3.3 GLibc

    Linux上通常使用的C函数库为glibc。glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现。

    glibc 各个库作用介绍

    因为嵌入式环境的资源及其紧张,所以现在除了glibc外,还有uClibc和eglibc可以选择,三者的关系可以参见这两篇文章:

    uclibc eglibc glibc之间的区别和联系

    Glibc vs uClibc Differences

    3.4 GDB

    GDB用于调试程序

    第 4 章 如何得到交叉编译链

    既然明白了交叉编译链的功能,那么在针对嵌入式系统开发时,我们需要的交叉编译链从哪儿得到?

    主要有三个方式可以获取

    4.1 下载已经做好的交叉编译链

    使用其他人针对某些CPU平台已经编译好的交叉编译链。我们只需要找到合适的,下载下来使用即可。

    常见的交叉编译链下载地址:

    1. http://ftp.arm.linux.org.uk/pub/armlinux/toolchain/ 下载已经编译好的交叉编译链
    2. http://www.denx.de/en/Software/WebHome 下载已经编译好的交叉编译链
    3. https://launchpad.net/gcc-arm-embedded下载已经编译好的交叉编译链
    4. 一些制作交叉编译链的工具中,包含了已经制作好的交叉编译链,可以直接拿来使用。如crosstool-NG
    5. 如果购买了某个芯片或开发板,一般厂商会提供对应的整套开发软件,其中就包含了交叉编译链。

    厂家提供的工具一般是经过了严格的测试,并打入了一些必要的补丁,所以这种方式往往是最可靠的工具来源。

    4.2 使用工具定制交叉编译链

    使用现存的制作工具,以简化制作交叉编译链这个事情的复杂度。我们只需要了解有哪些工具可以实现,并选个合适的工具,搞懂它的操作步骤即可。

    1. crosstool-NG
    2. Buildroot
    3. Embedded Linux Development Kit (ELDK)

    工具还有很多,各有各的优势和劣势,大家可以慢慢研究,在这就不细说了。

    4.3 从零开始构建交叉编译链

    这个是最困难也最耗时间的,毕竟制作交叉编译链这样的事情,需要对嵌入式的编译原理了解的比较透彻,至少要知道出了问题要往哪个方面去翻阅资料。而且,也是最考耐心和细心的地方,配错一个选项或是一个步骤,都可能出现以前从来没见过的问题,而且这些问题往往还无法和这个选项或步骤直接联系起来。

    当然如果搭建出来,肯定也是收获最大的,至少对于编译的流程和依赖都比较清楚了,细节上的东西可能还需要去翻看相应的协议或标准,但至少骨架会比较清楚。

    详细的搭建过程可以参看后续的文章,这里面有详细的参数和步骤:
    交叉编译详解 二 从零制作交叉编译链

    为了方便大家搭建交叉编译链,我写了一个一键生成的脚本(包括源码下载和自动编译)。如果大家自己一直搭建不成功,不妨试试这个脚本,然后对比下自己的流程是否一致,参数是否有差异,也许能帮大家迈过这个障碍:
    交叉编译详解 三 使用脚本自动生成交叉编译链

    4.4 对比三种构建方式

    项目 使用已有交叉编译链 自己制作交叉编译链
    安装 一般提供压缩包 需要自己打包
    源码版本 一般使用较老的稳定版本,对于一些新的GCC特性不支持 可以使用自己需要的GCC特性的版本
    补丁 一般都会打上修复补丁 普通开发者很难辨别需要打上哪些补丁,资深开发者可以针对自己的需求合入补丁
    源码溯源 可能不清楚源码版本和补丁情况 一切都可以定制
    升级 一般不会升级 可以随时升级
    优化 一般已经针对特定CPU特性和性能进行优化 一般无法做到比厂家优化的更好,除非自己设计的CPU
    技术支持 可以通过FAE进行支持,可能需要收费 只能通过社区支持,免费
    可靠性验证 已经通过了完善的验证 自己验证,肯定没有专业人士验证的齐全

    参考资料

    [1] Introduction to cross-compiling for Linux

    [2] binutils介绍

    [3] glibc 各个库作用介绍

    [4] uclibc eglibc glibc之间的区别和联系

    [5] Glibc vs uClibc Differences

    [6] 交叉编译链下载地址

    展开全文
  • 交叉编译

    千次阅读 2017-04-11 09:23:30
    参考一交叉编译大致过程1、首先配置环境变量。环境变量主要是为了下面的步骤做准备,如PATH等环境变量。将安装交叉编译器的bin目录添加到PATH环境变量,如 export PATH=/opt/eldk/usr/bin:$PATH 2、进入源码包根...

    参考一

    交叉编译大致过程

    1、首先配置环境变量。环境变量主要是为了下面的步骤做准备,如PATH等环境变量。将安装交叉编译器的bin目录添加到PATH环境变量,如

    export PATH=/opt/eldk/usr/bin:$PATH

    2、进入源码包根目录下,运行./configure。configure命令有很多参数可配置,可以用./configure –help来查看,在交叉编译过程中可设置–host,–target,–build这几个参数,如–host=ppc-linux,–build=i686-pc-linux-gnu,–target=ppc-linux。

    个人理解是–host表示主机上安装的交叉编译器对应目标板的架构和所运行操作系统,–target表示目标板的架构和所运行操作系统,–build表示主机的架构及操作系统类型。这些参数配置后,configure时会读取源码目录下面的config.sub文件,查找、检查设置的参数是否支持,如ppc架构是否支持、linux操作系统是否支持等。./configure –prefix参数表示生成的库文件所安装的目录,默认的是在/usr/local目录下。其他参数含义可以通过./configure –help来查看,configure过程中若失败可通过查找config.log文件来查找出错原因。./configure –diabale-可以把源码包中的某个模块不配置,编译的时候也就不编译,如配置thinkfinger时–disable-pam将pam模块配置排除在外。

    3、make。make的过程如果前期配置了正确的环境变量并configure成功后一般都没遇到什么问题,具体问题具体解决,可以通过查看控制台打印出来的信息了解make的过程。

    4、make install,主要是把生成的库文件、可执行文件等拷贝到合适的目录下,目标目录根你./configure时设置的–prefix参数有关。同样可以通过查看控制台打印出来的信息了解make install过程。

    附:thinkfinger的交叉编译过程

    ./configure –host=ppc-linux –build=i686-pc-linux-gnu –target=ppc-linux –prefix=/opt/eldk/ppc_4xx/usr –disable-pam
    make install
    make

    地址:http://www.360doc.com/content/11/1128/22/1317564_168224249.shtml

    交叉编译 host,build target的含义:
    build就是你正在使用的机器,host就是你编译好的程序可以运行的平台,
    target就是你编译的程序可以处理的平台.
    这个 build和host比较好理解,但是target就不好办了,到底什么意思呢?
    一般来说,我们平时所说的交差编译用不到他target的,
    比如. /configure –build=i386-linux,–host=arm-linux就可以了,在386的平台上编译可以运行在arm板的程序.

    原文地址 http://oss.lzu.edu.cn/blog/blog.php?/do_showone/tid_116.html

    参考二

    一)交叉编译器简介

    在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,这个编译过程就叫交叉编译.简单地说,就是在一个平台上生成另一个平台上的可执行代码.
    (二)体系结构与操作系统

    (1)常见的体系结构有ARM结构、x86结构等.

    (2)常见的操作系统有linux,windows等.

    (3)同一个体系结构可以运行不同操作系统,如x86上可以运行Linux、Windows等,在ARM上可以运行Linux、WinCE.

    (4)同一个操作系统可以在不同的体系结构上运行,比如Linux可以运行在x86上,也可以运行在ARM上.

    (5)同样的程序不可能运行在多个平台上,比如Windows下应用程序不能在Linux下运行.如果一个应用程序想在另一个平台上运行,必须使用 针对该平台的编译器,来重新编译该应用程序的二进制代码.比如在Linux系统下运行Windows平台的QQ软件,必须按照以下几个步骤:
    1.QQ程序源代码
    2.使用Linux下的编译器来编译QQ软件的源代码
    这样编译出来的可执行程序就可以在Linux下运行了.所以,如何使ARM来运行用户的应用程序呢,就需要用到针对ARM的编译器来编译程序.

    (三)使用交叉编译器的原因

    ARM上可以运行操作系统,所以用户完全可以将ARM当做计算机来使用,理论上也可以在ARM上使用本地的编译器来编译程序.但是,编译器在编译程序时, 会产生大量的中间文件,这会占用很大的内存和磁盘空间,且对CPU处理速度要求较高,比如S3C2440A内存、磁盘空间只有几十到100多兆,CPU只 有400-500MHz,完全达不到编译程序的要求.所以,在进行ARM-linux嵌入式开发时必须在PC机(x86结构)上编译出能够运行在ARM上 的程序,然后再将程序下载到ARM中来运行.这就用到了交叉编译器.
    

    要进行交叉编译,用户需要在主机平台上安装对应的交叉编译工具链(cross compilation tool chain),然后用这个交叉编译工具链编译用户的源代码,最终生成可在目标平台上运行的代码.交叉编译工具链可以从网上下载,也可以自己制作.但编译器 不是万能的,受版本限制,编译某些程序时会报错.常见的交叉编译工具链有:

    (1)Cross -2.95.3 tar: 该版本较早,除了编译vivi外一般不使用.

    (2)arm920t-eabi.tgz: 4.1.2版本的编译器,支持eabi,可以编译TX2440A开发板上的所有程序.

    (3)arm-linux-gcc: 4.3.2版本的编译器,支持eabi,是最常见的交叉工具链.

    Attention!!!

    什么是EABI
    EABI,Embeded application binary interface,即嵌入式应用二进制接口,是描述可连接目标代码、库目标代码、可执行文件影像、如何连接、执行和调试以及目标代码生成过程,和c, c++语言接口的规范,是编译连接工具的基础规范,也是研究它们工作原理的基础.简而言之,EABI就是一种编译规范,交叉编译器在编译时,对于浮点运算 会使用硬浮点运算,而对于没有硬浮点运算的处理器,比如S3C2440,会使用软浮点,但这样会在速度上受到很大的限制,而EABI则对浮点运算进行了优 化,提高了浮点运算的性能,节省了编译时间.

    (四)安装交叉工具链arm-linux-gcc 4.3.2

    安装交叉编译器arm-linux-gcc就是在主机平台(pc机的Linux操作系统)上安装对应的交叉编译工具链,换句话说,是将交叉编译器arm-linux-gcc 4.3.2在Linux操作系统下安装.安装步骤:

    (1)启动Samba服务器,打开共享目录/home/lishuai,将压缩文件arm-linux-gcc-4.3.2.tgz复制到/home/lishuai下.

    (2)解压软件包arm-linux-gcc-4.3.2.tgz.

    [root@localhost lishuai]#tar xzvf arm-linux-gcc4.3.2.tgz

    1.目录4.3.2就是该交叉编译器的目录.从arm-linux-gcc-4.3.2.tgz解压信息来看,该软件包需要解压在usr/local /arm下,而实际却解压到了共享目录/home/lishuai下

    2.进入目录usr/local/内,并没有找到arm文件夹,所以需要新建一arm文件夹,再将目录4.3.2移动到新建目录usr/local/arm下.其中,4.3.2/bin就是arm-linux-gcc的可执行文件.
    [root@localhost local]#mv /home/lishuai/usr/local/arm/4.3.2 ./

    3.进入目录/usr/local/arm/4.3.2/bin,可以看到不同类型的编译器.但在ARM下经常用到是arm-linux-gcc.其实它 也是一个gcc编译器,与gcc使用方法一致,不过该编译器是针对arm体系结构、Linux操作系统的编译器.利用该编译器就可以编译出运行在ARM上 的Linux操作系统下的应用程序.

    4.进入目录/usr/local/arm/4.3.2/arm-none-linux-gnueabi.其中,lib目录下存放的是库文件,用户编写的应用程序在运行时就依赖于这些库文件.

    5.此时还不能编译源码,系统一般会提示找不到命令arm-linux-gcc.这是环境变量在作祟.所以必须修改环境变量PATH.
    [root@localhost lishuai]#vi /etc/profile

    在”export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC”这一行的下面添加环境变量,
    输入:export PATH=/usr/local/arm/4.3.2/bin:$PATH
    指定变量PATH为交叉编译器的路径,目的是告诉操作系统可以到目录/usr/local/arm/4.3.2/bin下查找可执行文件
    6. 使环境变量生效

    root@localhost lishuai#:source /etc/profile
    //使已修改的配置文件/etc/profile生效

    7.查看arm-linux-gcc编译器的版本

    [root@localhost lishuai]#arm-linux-gcc -v

    (五)arm-linu-gcc应用实例

    实例:如何使用交叉编译器编译源码包boa-0.94.13.tar.tar
    1. 启动SMB服务器,将源码包放在共享文件夹/home/lishuai下
    2. 输入命令: tar xzvf boa-0.94.13.tar.tar

    //解压该源码包

    //一般的源码包内有Makefile文件,执行make就可以编译,但该源码包内没有,此时执行make是无效的

    //仍然没有Makefile,但找到了configure文件,通过执行configure文件可以生成Makefile

    [root@localhost lishuai]# ./configure

    //运行configure文件,生成了Makefile文件
    //由于要编译出在ARM平台上的程序,就需要使用交叉编译器.在Makefile文件内的绿色大写字母都是Makefile变量,可以看到变量 CFLAGS = -g -o2 -pipe -Wall -l,该变量是设置编译选项;变量CC = gcc,该变量是设置需要使用的编译器.由于要使用交叉编译器arm-linux-gcc,所以该变量应设置为CC = arm-linux-gcc,CPP = arm-linux-gcc -E,保存并退出.

    [root@localhost lishuai]#make

    //执行make进行编译
    //生成名为boa的可执行程序,该程序可下载到ARM内来执行

    其实,这个过程也叫做移植.移植就是将一个源码包经过修改、配置、交叉编译,然后下载到一个平台上运行.比如经常移植的有Bootloader、内核、QT等.

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hanzengyi/archive/2010/11/06/5991915.aspx

    参考三

      首先,所谓的configure虽然用的多,但是它也只是一个自动生成的东西,如果你打开这个东西一看,那真和天书差不多。我们下载下来的Linux开源工程,往往编译步骤是先执行命令./configure,检查是否符合编译条件,然后生成一个Makefile,才是make & make install。这个configure是一个自动生成的脚本文件,所用的工具是autoconf和automake,这两个工具,根据configure.in和makefile.am文件(可能还需要makefile.in吧,我不太清楚),生成configure。如果你拿到的开源代码有configure,那么肯定也有configure.in和makefile.am,这两个,才是人写给人看的,configure是机器写给机器看的。

      所以,如果我们想对一个由configure编译的工程进行交叉编译,一个思路就是修改configure.in和makefile.am(可以还需要修改makefile.in),不过显然我不是这样做的,太花时间了,还要额外去学autoconf和automake。一个比较简单的办法是通过设置configure的参数,因为configure也是一个工具,具有很好的可定制性。

      交叉编译,一般来说就是两个地方处理好就可以了:编译器和依赖库。

      对于configure来说,编译器可以通过环境变量CC来设置,因为configure生成编译器指向的时候,就是从环境变量里面找的,CC是C语言编译器,C++啊什么的,和普通Makefile的也是完全一样的。

      设置依赖库也是和makefile一样的,通过环境变量LDFLAGS。设置对应的头文件则是通过环境变量CFLAGS。

      那么,一个办法是直接修改这三个环境变量(暴力了一点),在一个办法就是在命令行里临时指定这三个环境变量,我用的是后面的办法,写了一个脚本文件如下:

    CC=/usr/local/arm11-toolchain/g4.4.2/cross-tools/bin/g-4.4.2 \
    LDFLAGS=”-L/home/third_party/source/lib -L/home/third_party/library/g-4.4.2/zlib/lib” \
    ./configure –build=i686-pc-linux –host=arm-linux –target=i686-linux \
    –enable-shared –prefix=PREFIX withfreetypeconfig=PREFIX/bin/freetype-config \
    –enable-libxml2 –with-arch=arm \
    CFLAGS=-I/home/third_party/library/g-4.4.2/freetype/include-I/home/third_party/library/g-4.4.2/freetype/include/freetype2 \

      第一行指定了交叉编译所用的编译器

      第二行指定了依赖库所在的目录

      最后一行是头文件所在目录,这个放在前面应该也可以……不过我没试过。

      但是需要注意的是粗体的那几行,–build指明的是在什么环境下编译,–host是要编译到哪个环境,–target是在什么环境下运行。如果你要做交叉编译,这三个选项是一定要写上的,否则configure不知道自己是在进行交叉编译。

      剩下的两个选项,就是原来的编译手册要求的,我照猫画虎放上去而已啦。每一行结束处的斜杠表示下一行要接上来(好长一行吧,所以才写成脚本)。

      你在做configure工程的交叉编译的时候,可以先试试看按照上面的办法,指定编译器、依赖库和头文件目录,另外就是加上build、host、target这三个参数,对于大部分程序,应该就可以了。

    这里是一个比较详细的 configure参数:http://www.linuxsky.org/doc/newbie/200801/242.html

    如果你对自己写configure有兴趣,可以参考这里:http://www.ibm.com/developerworks/cn/linux/l-makefile/

    参考四

    Linux的交叉编译 及configure配置

    这两天需要把一个CDVS的工程代码从Linux 平台上移植到ARM平台上,花了两天才搞定,之前很早申请的博客,到现在还没有技术文章会,以后决定凡是花两三天才搞定的东西都会把解决过程发到这里,很多东西靠百度什么的不太好使,必要的时候确实Google更好用。想想也是,在百度上搜,很多都是迄今为止中国程序员碰到过的问题,在Google上搜就是全世界程序员碰到过的问题。废话不多说了,切入正题。

    由于原工程已经在PC-Linux上跑通,所以只需要修改configure的配置参数即可。这里我通过linux下的build.sh来对configure传入脚本。

    下面试build.sh的脚本内容:

    #!/bin/sh
    # build the CDVS Test Model
    # with full optimizations and multithreading:
    CFLAGS="-march=armv7-a -O2 -DNDEBUG -fopenmp -pipe"
    export PATH=$PATH:/usr/local/arm/arm-hik_v7a-linux-uclibcgnueabi/bin
    # run configure with optimization flags and prepending "tm-" to all binaries (e.g. tm-extract, tm-match, etc.)
    mkdir -p build
    cd build
    CC=arm-hik_v7a-linux-uclibcgnueabi-gcc CXX=arm-hik_v7a-linux-uclibcgnueabi-c++ LD=arm-hik_v7a-linux-uclibcgnueabi-ld AR=arm-hik_v7a-linux-uclibcgnueabi-ar AS=arm-hik_v7a-linux-uclibcgnueabi-as NM=arm-hik_v7a-linux-uclibcgnueabi-nm STRIP= RANLIB=arm-hik_v7a-linux-uclibcgnueabi-strip  OBJDUMP=arm-hik_v7a-linux-uclibcgnueabi-objdump ../configure --build=i386-pc-linux-gnu --host=arm-hik_v7a-linux-uclibcgnueabi --target=arm-hik_v7a-linux-uclibcgnueabi --cache-file=arm-hik_v7a-linux-uclibcgnueabi.cache prefix=$HOME/cdvs_bin_for_arm --program-prefix="tm-" CFLAGS="${CFLAGS}" CXXFLAGS="${CFLAGS}" 
    # build all binaries
    make
    # install all binaries in $HOME/bin (no need of admin priviledges)
    make install

    对脚本的内容进行分析:

    首先是CFLAGS,里面定义了需要传入到configure的参数这里的-march变量是目标机的系统架构也就是architecture,由于我们的目标机上平台是armv7-a,所以此处赋值armv7-a。此处要留心,我一开始没有改,依然是native,那么configure会自动的用本机的arch值传入,这样就会编译失败。我一开始也不清楚这个地方具体应该填什么。这样我们可以查看编译器支持的芯片类型。

    我的编译器的前缀是arm-hik_v7a-linux-uclibcgnueabi,所以这是这个编译器下所有工具的前缀。

    由于交叉编译器已经安装在/usr/local/arm目录下,并且已经把/uar/local/arm/arm-hik_v7a-linux-uclibcgnueabi/bin目录添加到/etc/profile文件中,所以在控制台中可以直接调用编译器。

    在控制台中我们输入arm-hik_v7a-linux-uclibcgnueabi-gcc -v 此命令会输出该编译器的版本信息
    这里写图片描述

    在输出图片中我们可以看到变量–with-arch=armv7-a,一开始输成了ARMv7-A,各种乱试,确实需要从根源下手,直接查看编译器版本信息。OK,接下来进入下一步。

    可以看到脚本中还有一句PATH=$PATH:/usr/local/arm/arm-hik_v7a-linux-uclibcgnueabi/bin 这是对当前脚本执行的环境加上环境变量,不知道为什么在系统中添加环境变量后还是脚本运行时不能检索到编译器位置,一直报错,可以看config.log的输出日志。

    PATH: /usr/local/sbin
    PATH: /usr/local/bin
    PATH: /usr/sbin
    PATH: /usr/bin
    PATH: /sbin
    PATH: /bin

    在这里并没有将我们环境变量的值给读进来,

    而我打开终端中直接打印PATH,发现值已经在里面了。此处不太明白,所以我在build.sh里又中添加了export语句在临时追加环境变量。

    louyihang@ubuntu:~$ echo $PATH
    /home/louyihang/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/arm/arm-hik_v7a-linux-uclibcgnueabi/bin:/usr/local/arm/arm-hik_v7a-linux-uclibcgnueabi/bin

    接着我们在当前目录下用mkdir 创建build文件夹,整个编译过程中的各种输出文件都将会在这里除了最后的exe。

    在下面可以看到我定义了一堆变量,用来指定编译器

    CC=arm-hik_v7a-linux-uclibcgnueabi-gcc CXX=arm-hik_v7a-linux-uclibcgnueabi-c++ LD=arm-hik_v7a-linux-uclibcgnueabi-ld AR=arm-hik_v7a-linux-uclibcgnueabi-ar AS=arm-hik_v7a-linux-uclibcgnueabi-as NM=arm-hik_v7a-linux-uclibcgnueabi-nm STRIP= RANLIB=arm-hik_v7a-linux-uclibcgnueabi-strip  OBJDUMP=arm-hik_v7a-linux-uclibcgnueabi-objdump ../configure --build=i386-pc-linux-gnu --host=arm-hik_v7a-linux-uclibcgnueabi --target=arm-hik_v7a-linux-uclibcgnueabi --cache-file=arm-hik_v7a-linux-uclibcgnueabi.cache prefix=$HOME/cdvs_bin_for_arm --program-prefix="tm-" CFLAGS="${CFLAGS}" CXXFLAGS="${CFLAGS}" 

    CC变量指定的是gcc编译器,可以在configure文件中得知这个变量来告诉configure关于交叉编译器gcc的信息,同理CXX 指的是C++,只要前缀不变,所以接下来依样画葫芦把所需要用到的编译器直接定义在 configure语句执行之前。

    CC=arm-hik_v7a-linux-uclibcgnueabi-gcc CXX=arm-hik_v7a-linux-uclibcgnueabi-c++ LD=arm-hik_v7a-linux-uclibcgnueabi-ld AR=arm-hik_v7a-linux-uclibcgnueabi-ar AS=arm-hik_v7a-linux-uclibcgnueabi-as NM=arm-hik_v7a-linux-uclibcgnueabi-nm STRIP= RANLIB=arm-hik_v7a-linux-uclibcgnueabi-strip  OBJDUMP=arm-hik_v7a-linux-uclibcgnueabi-objdump 

    需要注意的是其实你这些语句总共是4行,其实这里是没有回车的,因为这整个一长串都是一条语句,只不过在configure的的编译器参数需要再configure之前被设置。

    OK这里弄完。接着看我们configure之后的参数。

    –build参数指定的是编译器完成整个build的工程的机器结构在这里我们输入i386-pc-linux-gnu

    –host参数指定最终生成可执行文件的运行环境 arm-hik_v7a-linux-uclibcgnueabi (也就是我们用的交叉编译器工具的前缀——即编译器的文件夹的名字 )这些都是一致的

    –target参数目标机的环境等同host。

    –cache-file在这里指定缓存文件的名字,在该文件中我们可以看到编译过程中的整个测试过程的结果和反馈。

    –prefix=$Home/cdvs_bin_for_arm 这里是最终生成可执行文件的安装目录也就是exe的存放目录。可以根据自己的需要调整。

    后面的–program-prefix CFLAGS CXXFLAGS的参数与linux PC机上一样不用调整。

    OK最后在最后跟上make make install 完成整个configure的配置。

    当然什么事情都不会跟教程一样顺利,接下来的问题总是不断。

    在终端中输入 sudo ./build.sh | more

    看输出内容
    这里写图片描述

    可以看到出现了 checking whether the C compiler works …no 后面还出现了error。

    看来 交叉编译器并没有开始工作。所以转入到build 文件夹下 打开config.log的输出日志。
    这里写图片描述

    看到一条语句 arm-hik_v7a-linux-uclibcgnueabi-gcc-raw: libgomp.spec: No such file or directory

    很明显这是由于库里少了一个文件,没有被编译器找到,所以需要再库里面添加进liggomp.spec这个文件。

    当时把我迷糊了好久,上哪里去整个这个文件,上百度也百度不到,上google也不好使。

    想到他毕竟是个gcc的编译器,库里面的东西大概都差不多吧,所以我去找了标准的arm-linux-gcc的库文件,记得当时的百度云里还有一份stm32的资料,整了一个下来。
    这里写图片描述

    打开这个arm-linux-gcc-4.4.3.tgz直接在压缩包里面检索关键字libgomp

    果然在这个编译器同样的lib下有了一堆跟libgomp相关的文件,所以把这些文件拷入到我们所需要的arm-hik_v7a-linux-uclibcgnueabi的编译器库下面

    OK再运行一次configure
    这里写图片描述
    咦,居然还是不过,再次看config.log文件
    这里写图片描述
    看到中间有一句 lib/libgomp.so: file not recognized: treating as linker script 和下面 lib/libgomp.so:1: syntax error。 不识别,这文件应该是不需要的被引入了,所以在Lib中将其删除。再次运行
    这里写图片描述
    OK 大功告成,可以看到whether the C compiler works …. yes 接下来一堆文件的测试,并且在指定目录生成了exe。

    整个过程花了差不多2天时间,第一次弄交叉编译,确实是有点费劲的,也发现了一些自己的不足,之前没有看log文件的习惯,后来发现这个东西是非常好的,非常有助于我们分析问题的原因。第一次写blog,写的比较乱,希望能帮到碰到同样问题的你!
    转自:http://www.cnblogs.com/louyihang-loves-baiyan/p/4171368.html

    展开全文
  • 什么是交叉编译

    千次阅读 2019-02-12 06:27:50
    第 1 章 交叉编译简介 1.1 什么是交叉编译 对于没有做过嵌入式编程的人,可能不太理解交叉编译的概念,那么什么是交叉编译?它有什么作用? 在解释什么是交叉编译之前,先要明白什么是本地编译。 本地编译 本地...

    第 1 章 交叉编译简介

    1.1 什么是交叉编译

    对于没有做过嵌入式编程的人,可能不太理解交叉编译的概念,那么什么是交叉编译?它有什么作用?

    在解释什么是交叉编译之前,先要明白什么是本地编译。

    本地编译

    本地编译可以理解为,在当前编译平台下,编译出来的程序只能放到当前平台下运行。平时我们常见的软件开发,都是属于本地编译:

    比如,我们在 x86 平台上,编写程序并编译成可执行程序。这种方式下,我们使用 x86 平台上的工具,开发针对 x86 平台本身的可执行程序,这个编译过程称为本地编译。

    交叉编译

    交叉编译可以理解为,在当前编译平台下,编译出来的程序能运行在体系结构不同的另一种目标平台上,但是编译平台本身却不能运行该程序:

    比如,我们在 x86 平台上,编写程序并编译成能运行在 ARM 平台的程序,编译得到的程序在 x86 平台上是不能运行的,必须放到 ARM 平台上才能运行。

    1.2 为什么会有交叉编译

    之所以要有交叉编译,主要原因是:

    • Speed: 目标平台的运行速度往往比主机慢得多,许多专用的嵌入式硬件被设计为低成本和低功耗,没有太高的性能
    • Capability: 整个编译过程是非常消耗资源的,嵌入式系统往往没有足够的内存或磁盘空间
    • Availability: 即使目标平台资源很充足,可以本地编译,但是第一个在目标平台上运行的本地编译器总需要通过交叉编译获得
    • Flexibility: 一个完整的Linux编译环境需要很多支持包,交叉编译使我们不需要花时间将各种支持包移植到目标板上

    1.3 为什么交叉编译比较困难

    交叉编译的困难点在于两个方面:

    不同的体系架构拥有不同的机器特性

    • Word size: 是64位还是32位系统
    • Endianness: 是大端还是小端系统
    • Alignment: 是否必修按照4字节对齐方式进行访问
    • Default signedness: 默认数据类型是有符号还是无符号
    • NOMMU: 是否支持MMU

    交叉编译时的主机环境与目标环境不同

    • Configuration issues:
    • HOSTCC vs TARGETCC:
    • Toolchain Leaks:
    • Libraries:
    • Testing:

    详细的对比可以参看这篇文章,已经写的很详细了,在这就不细说了:Introduction to cross-compiling for Linux

    第 2 章 交叉编译链

    2.1 什么是交叉编译链

    明白了什么是交叉编译,那我们来看看什么是交叉编译链。

    首先编译过程是按照不同的子功能,依照先后顺序组成的一个复杂的流程,如下图:

    编译流程

    那么编译过程包括了预处理、编译、汇编、链接等功能。既然有不同的子功能,那每个子功能都是一个单独的工具来实现,它们合在一起形成了一个完整的工具集。

    同时编译过程又是一个有先后顺序的流程,它必然牵涉到工具的使用顺序,每个工具按照先后关系串联在一起,这就形成了一个链式结构。

    因此,交叉编译链就是为了编译跨平台体系结构的程序代码而形成的由多个子工具构成的一套完整的工具集。同时,它隐藏了预处理、编译、汇编、链接等细节,当我们指定了源文件(.c)时,它会自动按照编译流程调用不同的子工具,自动生成最终的二进制程序映像(.bin)。

    注意:严格意义上来说,交叉编译器,只是指交叉编译的gcc,但是实际上为了方便,我们常说的交叉编译器就是交叉工具链。本文对这两个概念不加以区分,都是指编译链

    2.2 交叉编译链的命名规则

    我们使用交叉编译链时,常常会看到这样的名字:

    arm-none-linux-gnueabi-gcc
    arm-cortex_a8-linux-gnueabi-gcc
    mips-malta-linux-gnu-gcc
    

    其中,对应的前缀为:

    arm-none-linux-gnueabi-
    arm-cortex_a8-linux-gnueabi-
    mips-malta-linux-gnu-
    

    这些交叉编译链的命名规则似乎是通用的,有一定的规则:

    arch-core-kernel-system
    
    • arch: 用于哪个目标平台。
    • core: 使用的是哪个CPU Core,如Cortex A8,但是这一组命名好像比较灵活,在其它厂家提供的交叉编译链中,有以厂家名称命名的,也有以开发板命名的,或者直接是none或cross的。
    • kernel: 所运行的OS,见过的有Linux,uclinux,bare(无OS)。
    • systen:交叉编译链所选择的库函数和目标映像的规范,如gnu,gnueabi等。其中gnu等价于glibc+oabi;gnueabi等价于glibc+eabi。

    注意:这个规则是一个猜测,并没有在哪份官方资料上看到过。而且有些编译链的命名确实没有按照这个规则,也不清楚这是不是历史原因造成的。如果有谁在资料上见到过此规则的详细描述,欢迎指出错误。

    第 3 章 包含的工具

    3.1 Binutils

    Binutils是GNU工具之一,它包括链接器、汇编器和其他用于目标文件和档案的工具,它是二进制代码的处理维护工具。

    Binutils工具包含的子程序如下:

    • ld GNU连接器the GNU linker.
    • as GNU汇编器the GNU assembler.
    • addr2line 把地址转换成文件名和所在的行数
    • ar A utility for creating, modifying and extracting from archives.
    • c++filt Filter to demangle encoded C++ symbols.
    • dlltool Creates files for building and using DLLs.
    • gold A new, faster, ELF only linker, still in beta test.
    • gprof Displays profiling information.
    • nlmconv Converts object code into an NLM.
    • nm Lists symbols from object files.
    • objcopy Copys and translates object files.
    • objdump Displays information from object files.
    • ranlib Generates an index to the contents of an archive.
    • readelf Displays information from any ELF format object file.
    • size Lists the section sizes of an object or archive file.
    • strings Lists printable strings from files.
    • strip Discards symbols

    binutils介绍

    3.2 GCC

    GNU编译器套件,支持C, C++, Java, Ada, Fortran, Objective-C等众多语言。

    3.3 GLibc

    Linux上通常使用的C函数库为glibc。glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现。

    glibc 各个库作用介绍

    因为嵌入式环境的资源及其紧张,所以现在除了glibc外,还有uClibc和eglibc可以选择,三者的关系可以参见这两篇文章:

    uclibc eglibc glibc之间的区别和联系

    Glibc vs uClibc Differences

    3.4 GDB

    GDB用于调试程序

    第 4 章 如何得到交叉编译链

    既然明白了交叉编译链的功能,那么在针对嵌入式系统开发时,我们需要的交叉编译链从哪儿得到?

    主要有三个方式可以获取

    4.1 下载已经做好的交叉编译链

    使用其他人针对某些CPU平台已经编译好的交叉编译链。我们只需要找到合适的,下载下来使用即可。

    常见的交叉编译链下载地址:

    1. 在 http://ftp.arm.linux.org.uk/pub/armlinux/toolchain/ 下载已经编译好的交叉编译链
    2. 在 http://www.denx.de/en/Software/WebHome 下载已经编译好的交叉编译链
    3. https://launchpad.net/gcc-arm-embedded下载已经编译好的交叉编译链
    4. 一些制作交叉编译链的工具中,包含了已经制作好的交叉编译链,可以直接拿来使用。如crosstool-NG
    5. 如果购买了某个芯片或开发板,一般厂商会提供对应的整套开发软件,其中就包含了交叉编译链。

    厂家提供的工具一般是经过了严格的测试,并打入了一些必要的补丁,所以这种方式往往是最可靠的工具来源。

    4.2 使用工具定制交叉编译链

    使用现存的制作工具,以简化制作交叉编译链这个事情的复杂度。我们只需要了解有哪些工具可以实现,并选个合适的工具,搞懂它的操作步骤即可。

    1. crosstool-NG
    2. Buildroot
    3. Embedded Linux Development Kit (ELDK)

    工具还有很多,各有各的优势和劣势,大家可以慢慢研究,在这就不细说了。

    4.3 从零开始构建交叉编译链

    这个是最困难也最耗时间的,毕竟制作交叉编译链这样的事情,需要对嵌入式的编译原理了解的比较透彻,至少要知道出了问题要往哪个方面去翻阅资料。而且,也是最考耐心和细心的地方,配错一个选项或是一个步骤,都可能出现以前从来没见过的问题,而且这些问题往往还无法和这个选项或步骤直接联系起来。

    当然如果搭建出来,肯定也是收获最大的,至少对于编译的流程和依赖都比较清楚了,细节上的东西可能还需要去翻看相应的协议或标准,但至少骨架会比较清楚。

    详细的搭建过程可以参看后续的文章,这里面有详细的参数和步骤: 
    交叉编译详解 二 从零制作交叉编译链

    为了方便大家搭建交叉编译链,我写了一个一键生成的脚本(包括源码下载和自动编译)。如果大家自己一直搭建不成功,不妨试试这个脚本,然后对比下自己的流程是否一致,参数是否有差异,也许能帮大家迈过这个障碍: 
    交叉编译详解 三 使用脚本自动生成交叉编译链

    4.4 对比三种构建方式

    项目 使用已有交叉编译链 自己制作交叉编译链
    安装 一般提供压缩包 需要自己打包
    源码版本 一般使用较老的稳定版本,对于一些新的GCC特性不支持 可以使用自己需要的GCC特性的版本
    补丁 一般都会打上修复补丁 普通开发者很难辨别需要打上哪些补丁,资深开发者可以针对自己的需求合入补丁
    源码溯源 可能不清楚源码版本和补丁情况 一切都可以定制
    升级 一般不会升级 可以随时升级
    优化 一般已经针对特定CPU特性和性能进行优化 一般无法做到比厂家优化的更好,除非自己设计的CPU
    技术支持 可以通过FAE进行支持,可能需要收费 只能通过社区支持,免费
    可靠性验证 已经通过了完善的验证 自己验证,肯定没有专业人士验证的齐全

    参考资料

    [1] Introduction to cross-compiling for Linux

    [2] binutils介绍

    [3] glibc 各个库作用介绍

    [4] uclibc eglibc glibc之间的区别和联系

    [5] Glibc vs uClibc Differences

    [6] 交叉编译链下载地址

     

    展开全文
  • Linux中的交叉编译

    千次阅读 2018-03-30 11:54:36
    可是突然看到交叉编译这个概念交叉编译 编辑简单地说,就是在一个平台上生成另一个平台上的可执行代码。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。一直以为交叉...
  • 什么是交叉编译,为什么要使用交叉编译?

    万次阅读 多人点赞 2014-03-04 23:09:47
    一、什么是交叉编译  在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译。这个编译过程就叫交叉编译。简单地说,就是在一个平台上生成另一个平台上的可执行...
  • CMake交叉编译简单教程

    万次阅读 2018-09-07 16:21:18
    然后安装交叉编译链 一、CMake简介: CMake是一个跨平台的安装(编译)工具,可以通过简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件。   二、CMake命令 CMake的语句都...
  • golang交叉编译

    万次阅读 2020-10-14 15:20:27
    golang传的很牛X,但不能交叉编译,对我来说一点用都没有,有个开源项目是用golang写的,如果不能在arm上用,那么我只能将它“翻译”成C,再集成到我的产品中,但我没有这个时间。好在交叉编译最后还是成功了。1. ...
  • arm交叉编译

    千次阅读 2017-12-04 18:49:14
    arm交叉编译
  • arm交叉编译详解

    万次阅读 2016-11-03 18:22:04
    转载自 交叉编译详解–版本:v1.3.0, 有修改 CSDN GitHub arm交叉编译详解 AderXCoding/system/tools/cross_compile 本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可, 转载请注明...
  • 交叉编译学习笔记(一)——交叉编译和交叉工具链
  • openssl的编译与交叉编译

    万次阅读 2020-10-26 21:03:34
    1、下载openssl源码包 ...2、Ubuntu编译与安装openssl ./config配置生成Makefile,-shared 表示生成动态库,也可通过参数 -prefix=xxx 自行指定安装目录,如下不配置则为默认安装路径。 # tar zxvf o...
  • 上篇介绍了交叉编译的基本原理,以及交叉编译一个简单的HelloWorld程序,这篇将介绍如何交叉编译Qt程序。 由于Qt程序依赖的底层以及第三方的相关库太多(比如libGL.so库为OpenGL库,libX11.so库为系统图像库等等),...
  • 我有一个交叉编译链,我写了一个简单的helloword c程序,进行交叉编译。在bin目录下有个 mips-linux-g cc 这个 我敲入 [root@Master bin]# mips-linux-gcc -L/home/opt/toolchains/crosstools-mips-gcc-4.6-linux-...
  • 先看这个: 资料 https://blog.csdn.net/gsh_hello_world/article/details/56277182 https://blog.csdn.net/gsh_hello_world/article/details/81335955 搭建所需环境 Linux版本:Ubuntu 14....
  • linux交叉编译和内核编译

    千次阅读 2018-10-05 21:59:58
    一、交叉编译arm-linux-gcc 由于嵌入式系统资源匮乏,一般不能像 PC 一样安装本地编译器和调试器,不能在本地编写、编译和调试自身运行的程序,而需借助其它系统如 PC 来完成这些工作,这样的系统通常被称为宿主机。...
  • Linux下的Qt环境搭建(arm交叉编译)

    万次阅读 2020-09-24 17:59:45
    Linux下的Qt环境搭建(arm交叉编译)Qt环境安装应用安装gl库安装交叉编译器配置交叉编译器到qtcreator创建应用编译运行设置成开机自启动 注意:本文软件环境为在虚拟机里搭建的ubuntu-14.04.5-desktop-amd64.iso,...
  • 一、什么是交叉编译 在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译。这个编译过程就叫交叉编译。简单地说,就是在一个平台上生成另一个平台上的可执行...
  • 我的用的是centos,在上面用交叉编译链编译一个软件。首先下载软件,解压,然后进入目录,执行./config 生成Makefile文件,将其中的编译器换成交叉编译链中的编译器。然后make 结果用file命令查询编译的文件属性,...
  • 交叉编译qemu

    千次阅读 2011-12-06 23:54:14
    交叉编译qemu 前言:libX11的交叉编译确实非常繁琐,而对于系统调用accept4和preadv&pwritev则需要glibc-2.10以上才会支持,之前的glibc是2.9很悲催。。。。明天去龙芯机子上调试,但愿比较顺利。 作者:...
1 2 3 4 5 ... 20
收藏数 105,804
精华内容 42,321
关键字:

交叉编译