精华内容
下载资源
问答
  • 手把手搭建arm/mips交叉编译环境
    2021-09-02 10:44:52

    一、什么是交叉编译

    对于没有做过嵌入式编程的人,可能不太理解交叉编译的概念,那么什么是交叉编译?它有什么作用?
    在解释什么是交叉编译之前,先要明白什么是本地编译。

    本地编译
    本地编译可以理解为,在当前编译平台下,编译出来的程序只能放到当前平台下运行。平时我们常见的软件开发,都是属于本地编译:
    比如,我们在 x86 平台上,编写程序并编译成可执行程序。这种方式下,我们使用 x86 平台上的工具,开发针对 x86 平台本身的可执行程序,这个编译过程称为本地编译。

    交叉编译
    交叉编译可以理解为,在当前编译平台下,编译出来的程序能运行在体系结构不同的另一种目标平台上,但是编译平台本身却不能运行该程序:
    比如,我们在 x86 平台上,编写程序并编译成能运行在 ARM 平台的程序,编译得到的程序在 x86 平台上是不能运行的,必须放到 ARM 平台上才能运行。

    二、为什么会有交叉编译

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

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

    三、什么是交叉编译工具链

    一般所说的工具链,指的是本地平台自己的工具链。而用于交叉编译的工具链,就是交叉工具链。交叉工具链中,gcc编译器、ld链接器以及其他的相关工具,都是用来跨平台交叉编译的。

    交叉工具链与本地工具链类似,也有交叉编译版本的gcc, ld, as等工具,与本地工具链两两对应。交叉工具链中最重要的工具还是编译器gcc,所以我们也经常把交叉工具链简称为交叉编译器,即严格意义上来讲,交叉编译器指的是交叉编译版本的gcc,但为了叫法上的方便,我们平常说的交叉编译,其实指的都是交叉工具链。

    例如常用的交叉编译器arm-linux-gcc,其实是一系列交叉编译版本的交叉工具链,其中包含了arm-linux-gcc, arm-linux-ld, arm-linux-as等工具。

    四、如何部署交叉编译环境

    国产UOS

    • 更新一下apt源
    $ sudo apt-get update
    
    • 执行命令安装
    $ sudo apt-get install emdebian-archive-keyring 
    $ sudo apt-get install linux-libc-dev-mips64el-cross libc6-mips64el-cross
    # sudo apt-get install linux-libc-dev-arm64-cross libc6-arm64-cross
    $ sudo apt-get install binutils-mips64el-linux-gnuabi64 gcc-8-mips64el-linux-gnuabi64
    # sudo apt-get install binutils-aarch64-linux-gnu gcc-8-aarch64-linux-gnu
    $ sudo apt-get install g++-8-mips64el-linux-gnuabi64
    # sudo apt-get install g++-8-aarch64-linux-gnu
    

    #注释的内容为aarch64 架构的交叉编译链工具

    • 验证:执行命令
    $ mips64el-linux-gnuabi64-gcc-8 -dumpmachine
    mips64el-linux-gnuabi64
    

    五、编写第一个Hello world

    • 创建c文件
    $ vim hello.c
    // 程序头文件
    #include <stdio.h>
    // 主入口函数
    int main(int arc, char* argv[])
    {
      printf("Hello World!\n");
    	return 0;
    }
    
    • 编译第一个程序
    $  mips64el-linux-gnuabi64-gcc-8 -o hello hello.c
    
    • 查看文件类型
    $ file hello
    hello: ELF 64-bit LSB pie executable, MIPS, MIPS64 rel2 version 1 (SYSV), dynamically linked, interpreter 
    /lib64/ld.so.1, BuildID[sha1]=0860832b7cdda9bc95325462a0c79b78ffe3b3f0, for GNU/Linux 3.2.0, not stripped
    
    更多相关内容
  • 什么是交叉编译

    万次阅读 多人点赞 2017-06-30 09:21:17
    第 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] 交叉编译链下载地址

     

    展开全文
  • CentOS 7 搭建交叉编译环境(上)

    千次阅读 2019-11-20 23:11:39
    前段时间由于工作上的需要,需要编译程序在MIPS架构的终端上运行,于是就学习了一下交叉编译相关的一些知识,并尝试自己搭建了交叉编译环境最终编译程序运行OK,现对该学习过程做个总结; 什么是交叉编译 本地编译...


    前段时间由于工作上的需要,需要编译程序在MIPS架构的终端上运行,于是就学习了一下交叉编译相关的一些知识,并尝试自己搭建了交叉编译环境最终编译程序运行OK,现对该学习过程做个总结;

    什么是交叉编译

    本地编译:即在当前目标平台下编译出来的程序,并且可以运行在当前平台上;简单理解就是编译和运行环境是一致的。

    交叉编译:所谓的交叉(cross)是一个和本地编译相对应的概念,即在当前目标平台下编译出来的程序,是放到别的平台上运行(放在当前平台上运行不了),简单理解就是编译和运行的环境是不一样的。


    为什么要交叉编译

    那有了本地编译,我们为什么还要需要交叉编译呢?给每种平台都搭建一套本地的编译环境不就OK了吗 ? 理想是丰满的,现实是残酷的;

    原因:嵌入式系统中的资源太少,各种资源,都相对有限,所以很难进行直接的本地编译;因为编译,开发,都需要相对比较多的CPU,内存,硬盘等资源,而嵌入式开发上的那点资源,只够嵌入式(Linux)系统运行的,没太多剩余的资源供你本地编译。


    交叉编译环境介绍

    既然要搭建交叉编译环境,那我们需要怎么做呢?下面我们先看一个GCC编译C语言的流程,如下所示:
    在这里插入图片描述

    从上图可以看到,GCC的编译流程主要分为4步:

    1)预处理 ( Pre-Process ) ------如,gcc -E test.c -o test.i
    2)编译 ( Compile )       ------如,gcc -S test.i -o test.s
    3)汇编 ( Assemble )      ------如,gcc -c test.s -o test.o
    4)链接 ( Link )          ------如,gcc test.o -o test  
    
    • 注:gcc编译的一般格式:gcc 【选项】源文件 【选项】目标文件

    再清楚了GCC编译流程以后,其实交叉编译环境的搭建最主要就是完成上面4个步骤,即将一堆C源文件编译成一个可执行程序的过程;这个过程需要依赖许多工具,最核心的编译器gcc 、汇编器as、 链接器ld等;而as 和 ld 都是包含在binutils 中,因此,简单的说搭建交叉编译环境就是安装相应的gcc + binutils + C运行库(如、glibc、uclibc或eglibc)。下面来看看具体工具主要完成编译过程的哪些任务:

    1)gcc(gnu collect compiler):是一组编译工具的总称。它主要完成的工作任务是“预处理”和“编译”,以及提供了与编译器紧密相关的运行库的支持,如libgcc_s.so、libstdc++.so等。

    2 )binutils: 提供了一系列用来创建、管理和维护二进制目标文件的工具程序,如汇编(as)、连接(ld)、静态库归档(ar)、反汇编(objdump)、elf结构分析工具(readelf)、无效调试信息和符号的工具(strip)等。通常,binutils与gcc是紧密相集成的,没有binutils的话,gcc是不能正常工作的。

    3)C 运行库:glibc = GNU C Library 实现的 C语言标准库(C standard library)是 Linux系统中最底层的API,几乎其它任何的运行库都会依赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现,其实现了常见的C库的函数,支持很多种系统平台,功能很全,但是也相对比较臃肿和庞大;因此在嵌入式开发环境通常采用的是uclibc等小型的C运行库;而 eglibc 是 glibc的一种变体,目标是与glibc兼容,模块化、降低资源和内存的消耗将glibc用于嵌入式系统;


    那所谓的交叉编译工具链就是将相关的gcc,binutils、glibc等工具按照先编译后链接等内在逻辑串起来;而由交叉编译工具链组成的综合开发环境就是交叉编译环境


    crosstool-NG 工具介绍与安装

    在了解GCC编译过程以及交叉编译环境的组成,下面我们介绍一款当下用的比较多的制作交叉编译环境的工具,即 crosstool-NG,其是在crosstool的基础上,做了全新的升级,也称下一代crosstool。

    crosstool-NG 制作交叉编译工具链的命名规则一般如下:

    arch-vendor-kernel-system
    

    arch :即系统架构,即用此交叉编译器编译出来的程序,是运行在哪种CPU上面的,常见的有很多种,比如ARM,X86,MIPS 等等。

    vendor :即生成厂家,提供商,表示谁提供的,即谁制作出来这个交叉编译器的,可以自己随便填写的。

    kernel :直译为,内核,主要有两类:

    • Linux

      表示:有OS(此处主要指的是Linux )操作系统的环境;简称为,有OS的目标系统:Linux

    • bare-metal:

      表示:无OS(此处主要指的是Linux)操作系统的环境,简称为:无OS系统的:bare-metal,直译为:裸金属;

    system :直译为,系统,其实主要表示的是交叉编译器所选择的C运行库,最常见的一些值有,gnu,gnueabi,uclibcgnueabi等等。


    crosstool-NG 安装环境:CentOS 7 (x86_64)虚机;


    首先,我们需要明白crosstool-ng并不是交叉编译环境的一部分,它只是制作交叉编译环境(或制作交叉编译工具链)的一种工具;因此,在制作交叉编译环境之前,我们需要安装crosstool-ng这个工具,本文将采用源码编译安装的方式获取该工具。

    第一步:下载源码,源码链接:http://crosstool-ng.org/download/crosstool-ng/crosstool-ng-1.23.0.tar.xz,这是当前次新版本(最新版本是1.24.0);

    第二步:解压、编译、安装

    [root@localhost ~]# cd /zhb
    [root@localhost zhb]# ls
    crosstool-ng-1.23.0.tar.xz
    [root@localhost zhb]# tar xf crosstool-ng-1.23.0.tar.xz
    [root@localhost zhb]# ls
    crosstool-ng-1.23.0  crosstool-ng-1.23.0.tar.xz
    [root@localhost zhb]# cd crosstool-ng-1.23.0
    [root@localhost crosstool-1.23.0]# ./configure --prefix=/usr/local/crosstool-1.23.0
    [root@localhost crosstool-ng-1.23.0]# make -j8 && make install
    

    注:在执行上面./configure ***生成Makefile 时,会报缺少一些包,大致有以下这些包,先安装这些包再次执行即可,如果还有报错继续安装,总之缺什么包就安装什么包:

    yum install gperf bison flex bzip2 texinfo help2man patch  ncurses-devel
    

    等待编译完成之后,进入到/usr/local/crosstool-1.23.0目录下执行如下命令:tree -L 2

    [root@localhost crosstool-1.23.0]# tree -L 2
    .
    ├── bin
    │   └── ct-ng
    ├── lib
    │   └── crosstool-ng-1.23.0
    └── share
        ├── doc
        └── man
    
    6 directories, 1 file
    

    我们可以看到bin 目录下已经生成了我们需要的工具ct-ng;

    第三步:配置、测试

    .bashrc最后一行添加,如下所示:

    PATH=/usr/local/crosstool-1.23.0/bin:$PATH
    

    重新打开一个终端,执行 ct-ng 命令,出现如下界面表示安装成功;在这里插入图片描述
    到这里,我们就完成了安装制作交叉编译环境的工具,即接下来我们需要利用crosstool-ng制作交叉编译环境(或交叉编译工具链);


    本文就介绍到这里,如果有写的不对或不周的地方欢迎指正,下篇将具体介绍通过 crosstool-NG 制作交叉编译环境,谢谢阅读~



    附:

    表:GCC 的常用选项

    选项功能描述
    -o生成目标文件,可以是.i、.s以及.o文件
    -E只运行C预处理器
    -c通知GCC 取消链接,即只编译生成目标文件,并不做最后的链接
    -Wall生成所有告警信息
    -w不生成任何告警信息
    -I指定头文件的目录路径
    -L指定库文件的目录路径
    -static链接成静态库
    -g包含调试信息
    -v打印编译过程中的命令行和编译器版本等信息
    -Werror把所有警告信息转化成错误信息,并在警告发生时终止编译
    -O0关闭所有优化选项
    -O 或O1最基本的优化等级
    -O2-O1的进阶等级,推荐使用的优化等级,编译器会尝试提高代码性能,而不会增加体积和大量占用编译时间
    -O3最高优化等级,会延长编译时间
    展开全文
  • 交叉编译指在一个平台上生成另一个平台可执行的代码,这里的平台包括体系结构(Architecture)和操作系统(Operating System)。同一个体系结构可以运行不同的操作系统,且同一个操作系统也可以在不同体系结构上运行...

    • 交叉编译指在一个平台上生成另一个平台可执行的代码,这里的平台包括体系结构(Architecture)和操作系统(Operating System)。同一个体系结构可以运行不同的操作系统,且同一个操作系统也可以在不同体系结构上运行。本文从两个方面讲解如何搭建Linux交叉开发环境。
    • 在两种情况下,通常需要交叉编译:第一,在项目的起始阶段,目标平台还没有建立,此时需要进行交叉编译,以生成所需的bootloader(启动引导代码)以及操作系统核心;第二,当目标平台能启动后,由于目标平台上的资源有限,当编译大型程序时,有可能也需要交叉编译。

    一、建立交叉编译开发工具链

    • 建立交叉编译开发工具链有两种方法:手动编译一个工具链和直接下载制作好的工具链。

    1.1 编译工具链

    • 在进行嵌入式开发前,需要建立一套由编译器、连接器和libc库等构成的交叉编译环境。下面以建立针对ARM的交叉编译开发环境为例来讲解,注意本文采用的开发环境式宿主机为i386-redhat-9.0、目标机为ARM。
    • 整个编译过程包括:(1)下载源文件、补丁和建立编译的目录;(2)建立内核头文件;(3)建立二进制工具(binutils);(4)建立初始编译器(bootstrap gcc);(5)建立C库(glibc);(6)建立全套编译器(full gcc)。

    1.1.1 下载源文件、补丁和建立编译的目录

    • (1)选定软件的版本号。先查看glibc代码中的INSTALL文件,该文件中列举了本版本的glibc编译时所需要的binutils和gcc的版本号。本文采用的软件本文为:linux-2.4.21+rmk2;gcc-2.95.3;glibc-2.2.3;glibc-linuxthreads-2.2.3。Linux内核可以从www.kernel.org网站上下载。binutils、gcc和glibc可以从FSF的FTP站点(http://ftp.gnu.org/gnu/)下载。在编译glibc时,需要到Linux内核中的include目录的内核头文件。gcc推荐使用gcc-2.95以上版本,太老的版本在编译时可能出现问题,gcc-2.95.3是一个比较稳定的版本,也是内核开发人员推荐使用的。另外,太新的版本大多数没有经过大量的测试,建议不要选用。
    • (2)建立几个用来工作的目录。假设用户目录为/home/liang,则建立一个项目目录embedded:
    • $pwd
    • /home/liang
    • $mkdir embedded
    • 然后,在这个项目目录embedded下建立3个子目录build-tools、kernel和tools。
    • build-tools用来存放下载的binutils、gcc和glibc的源代码以及编译这些源代码的目录。
    • kernel用来存放内核代码和内核补丁。
    • tools用来存放编译好的交叉编译工具和库文件,指令如下:
    • $cd /home/liang/embedded
    • $mkdir build-tools kernel tools
    • 执行完上述命令后,目录结构如下:
    • $ls embedded
    • build-tools kernel tools
    • 紧接着,需要输出环境变量,输入如下环境变量以便编译:
    • $export PRJROOT=/home/liang/embedded
    • $export TARGET=arm-linux
    • $export PREFIX=$PRJROOT/tools
    • $export TARGET_PREFIX=$PREFIX/$TARGET
    • $export PATH=$PREFIX/bin:$PATH
    • 如果不想用环境变量,也可以直接采用绝对路径。环境变量也可以定义在.bashrc文件中,这样当logout或换了控制台时,就不用总是export这些变量了。
    • 体系结构和TARGET变量对应值下表所示:
    体系结构TARGET
    PowerPCPowerpc-linux
    ARMarm-linux
    MIPS(big endian)mips-linux
    MIPS(little endian)mipsel-linux
    MIPS64mips64-linux
    SuperH3sh3-linux
    SuperH4sh4-linux
    I386i386-linux
    Ia64ia64-linux
    M68km68k-linux
    M88km88k-linux
    Alphaalpha-linux
    Sparcsparc-linux
    Sparc64sparc64-linux
    • 可以在通过glibc下的config.sub脚本来之道所选用的TARGET变量是否被支持,例如:
    • $./config.sub arm-linux
    • 上述环境中,config.sub在glibc-2.2.3/scripts目录下。
    • (3)建立编译目录。为了把源代码和编译时生成的文件分开,通常编译工作不在源码目录中进行,需要新建一个目录专门用来编译。用如下的命令来建立编译下载的binutils、gcc和glibc的源代码的目录:
    • $cd $PRJROOT/build-tools
    • $mkdir build-binutils build-boot-gcc build-gcc build-glibc gcc-patch
    • 其中,build-binutils——编译binutils的目录;
    • build-boot-gcc——编译gcc启动部分的目录;
    • build-glibc——编译glibc的目录;
    • build-gcc——编译gcc全部目录;
    • gcc-patch——存放gcc的补丁的目录。
    • gcc-2.95.3的补丁包括gcc-2.95.3-2.patch、gcc-2.95.3-no-fixinc.patch和gcc-2.95.3-returntype-fix.patch,这些均可以从“http://www.linuxfromscratch.org”下载这些补丁。再将下载的binutils-2.10.1、gcc-2.95.3、glibc-2.2.3和glibc-linuxthreads-2.2.3的源代码放入build-tools目录中。
    • build-tools目录的内容包含如下:
    • $ls
    • binutils-2.10.1.tar.bz2 build-gcc gcc-patch
    • build-binutils build-glibc glibc-2.2.3.tar.gz
    • build-boot-gcc gcc-2.95.3.tar.gz glibc-linuxthreads-2.2.3.tar.gz

    1.1.2 建立内核头文件

    • (1)把从“www.kernel.org”下载的内核源代码放入到$PRJROOT/kernel目录。进入kernel目录:
    • $cd $PRJROOT /kernel
    • 解压内核源代码:
    • $tar -xzvf linux-2.4.21.tar.gz
    • 或者
    • $tar -xjvf linux-2.4.21.tar.gz
    • 给Linux内核打上补丁:
    • $cd linux-2.4.21
    • $patch -p1 < ../patch-2.4.21-rmk2
    • 编译内核生成头文件:
    • $make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig
    • 配置完成后保存并退出,检查内核目录中是否生成include/linux/version.h和/include/linux/autoconf.h文件,它们两个是编译glibc时需要用到的,如果这两个文件存在就说明生成了正确的头文件。
    • (2)紧接着,需要建立几个正确的链接:
    • $cd include
    • $ln -s asm-arm asm
    • $cd asm
    • $ln -s arch-epxa arch
    • $ln -s proc-armv proc
    • 执行完,这几条命令后,即可以为交叉编译环境建立内核头文件链接了,代码如下:
    • $mkdir -p $TARGET_PREFIX/include
    • $ln -s $PRJROOT/kernel/linux-2.4.21/include/linux $TARGET_PREFIX/include/linux
    • $ln -s $PRJROOT/kernel/linux-2.4.21/include/asm-arm
    • $TARGET_PREFIX/include/asm

    1.1.3 建立二进制工具(binutils)

    • binutils是一些二进制工具的集合,其中包含了一些常用的as和ld。
    • 解压下载的binutils源文件:
    • $cd $PRJROOT/build-tools
    • $tar -xjvf binutils-2.10.1.tar.bz2
    • 然后进入build-binutils目录配置和编译binutils:
    • $cd build-binutils
    • $../binutils-2.10.1/configure --target=$TARGET --prefix=$PREFIX
    • “–target”选项表示生成的是arm-linux的工具,“–prefix”表示可执行文件的安装位置。此时会出现很多check,最后生成Makefile文件。有了Makefile文件后,需要进一步编译并安装binutils,如下所示:
    • $make
    • $make install
    • 此时,$PREFIX/bin中生成的文件如下:
    • $ls $PREFIX/bin
    • arm-linux-addr2line arm-linux-objecopy arm-linux-ar arm-linux-objdump arm-linux-as arm-linux-ranlib arm-linux-c++filt arm-linux-readelf arm-linux-gasp arm-linux-size arm-linux-ld arm-linux-strings arm-linux-nm arm-linux-strip
    • 其中,addr2line——将要照的地址转换为文件和行号,它要使用debug信息;
    • objcopy——将某种格式的目标文件转换为另一种格式的目标文件;
    • ar——生成、修改和解压一个存档文件;
    • objdump——显示目标文件的信息;
    • as——gnu的汇编器;
    • ranlib——为一个存档文件生成一个索引,并将这些索引存入存档文件中;
    • c++filt——C++和java中由一种重载函数,所用的重载函数最后会被编译转换为汇编的标号,c++filt就是实现这种反向的转换,并根据标号得到函数名;
    • readelf——显示elf格式的目标文件的信息;
    • gasp——gnu汇编器的预编译器;
    • size——显示目标文件各个节与目标文件的大小;
    • ld——gnu的连接器;
    • strings——打印出目标文件中可以打印的字符串,默认长度为4;
    • nm——罗列目标文件的符号与对应地址;
    • strip——去掉目标文件的所有符号信息。

    1.1.4 建立初始编译器(bootstrap gcc)

    • 注意,在编译和安装gcc之前,还需要修改一个文件“$PRJROOT/gcc/config/arm/t-linux”,把“TARGET_LIBGCC2-CFLAGS=-fomit-frame-pointer-fPIC”这一行修改成:
    • TARGET_LIBGCC2-CFLAGS=-fomit-frame-pointer-fPIC-Dinhibit_libc-D__gthr_posix_h。
    • (1)进入build-tools目录,下载gcc源代码并解压:
    • $cd $PRJROOT/build-tools
    • $tar -xvzf gcc-2.95.3.tar.gz
    • (2)进入gcc-2.95.3目录,给gcc打上补丁:
    • $cd gcc-2.95.3
    • $patch -pl< ../gcc-patch/gcc-2.95.3.-2.patch
    • $patch -pl< ../gcc-patch/gcc-2.95.3.-no-fixinc.patch
    • $patch -pl< ../gcc-patch/gcc-2.95.3-returntype-fix.patch
    • $echo timestamp > gcc/cstamp-h.in
    • (3)配置bootstrap gcc,后续采用bootstrap gcc来编译glibc库:
    • $cd ..
    • $ cd build-boot-gcc
    • $../gcc-2.95.3/configure --target=$TARGET --prefix=$PREFIX >--without-headers --enable-languages=c --disable-threads
    • 上条命令中的“–target”、“–prefix”与配置binutils的含义是相同的;“–without-headers”表示不需要头文件,这是因为采用的是交叉编译工具,因此不需要本机上的头文件。“–enable-languages=c”表示boot-gcc只支持C语言;“–disable-threads”表示去掉thread功能,该功能需要glibc的支持。
    • (4)编译和安装boot-gcc
    • $make all-gcc
    • $make install-gcc
    • 下面罗列出$PREFIX/bin中多出来的文件:
    • $ls $PREFIX/bin
    • arm-linux-gcc arm-linux-unprotoize cpp gcov
    • 其中,gcc——gnu的C语言编译器;
    • unprotoize——将ANSI C的代码转换为K&R C的形式,即去掉函数原型的参数类型;
    • cpp——gnu的C语言预编译器;
    • gcov——gcc的辅助测试工具,可以用来分析和优化程序。
    • 注意!在使用gcc3.2以上版本(包括自己)时,配置boot-gcc时不能使用–without-headers选项,因为需要使用glibc的头文件。

    1.1.5 建立C库(glibc)

    • (1)解压glibc-2.2.3.tar.gz和glibc-linuxthreads-2.2.3.tar.gz的源代码:
    • $cd $PRJROOT/build-tools
    • $tar -xvzf glibc-2.2..3.tar.gz
    • $tar -xvzf glibc-linuxthreads-2.2.3.tar.gz --directory=glibc-2.2.3
    • (2)进入build-glibc目录配置glibc:
    • $cd build-glibc
    • $CC=arm-linux-gcc ../glibc-2.2.3/configure --host=$TARGET --prefix="/usr" --enable-add-ons --with-headers=$TARGET_PREFIX/include
    • “CC=arm-linux-gcc”是把CC变量设置为编译后的bootstrap gcc,用它来编译glibc;“–enable-add-ons”表示glibc采用放入glibc源码目录中的linuxthreads包,该命令等价于“-enable-add-ons=linuxthreads”;“–with-headers”表示glibc linux内核头文件的目录位置。
    • (3)编译和安装glibc:
    • $make
    • $make install_root=$TARGET_PREFIX prefix="" install
    • 注意,此时需要修改libc.so文件,将GROUP(/lib/libc.so.6/lib/libc_nonshared.a)修改为GROUP(libc.so.6 libc_nonshared.a)。

    1.1.6 建立全套编译器(full gcc)

    • (1)建立全套编辑器,此处需要支持C和C++语言:
    • $cd $PRJROOT/build-tools/build-gcc
    • $../gcc-2.95.3/configure --target=$TARGET --prefix=$PREFIX --enable-languages=c,c++
    • “–enable-languages=c,c++”表示full gcc支持C和C++语言。
    • (2)编译和安装full gcc:
    • $make all
    • $make install
    • 查看$PREFIX/bin中多了那些文件:
    • $ls $PREFIX/bin
    • arm-linux-g++ arm-linux-protoize arm-linux-c++
    • 其中,g++——gnu的C++编译器;
    • protoize——与unprotoize相反,将K&R C的源码转换为ANSI C的形式,在函数原型中加入参数类型;
    • c++——gnu的C++编译器。
    • 至此,交叉编译工具已经编译完成了。

    1.2 下载工具链

    通常,编译一个交叉工具链非常复杂,而且很容出错。因此,直接下载一个编译好的工具链是非常实用的。本文介绍Denx公司发布的一套开源的嵌入式Linux开发工具链ELDK(Embedded Linux Development Kit,ELDK),ELDK不仅简单而且非常好用,最重要的是它还是完全免费的!ELDK的下载网址如下表所示:

    HTTPFTP
    http://mirror.switch.ch/ftp/mirror/eldk/eldk/ftp://mirror.switch.ch/mirror/eldk/eldk/
    http://sunsite.utk.edu/ftp/pub/linux/eldk/ftp://sunsite.utk.edu/pub/linux/eldk/
    http://ftp.sunet.se/pub/Linux/distributions/eldk/ftp://ftp.sunet.se/pub/Linux/distributions/eldk/
    http://archiv.leo.org/pub/comp/os/unix/linux/eldk/ftp://ftp.leo.org/pub/eldk/
    • ELDK同时支持ARM、PPC、MIPS等多种处理器,它包括一个安装工具和很多RPM包,它可以安装到用户的交叉编译的主机中。ELDK的RPM包分为两类:(1)嵌入式Linux开发工具;(2)为目标处理器编译号的工具和元件。其中,第一部分执行在开发主机上的交叉编译工具,包括gnu交叉编译器gcc、binutils和gdb等;第二部分是一些已经编译好的、能在目标开发板上运行的工具和库,这些工具和库可以用来建立一个Linux的Roofs文件系统。ELDK中的元件包如下表所示:
    名称版本名称版本
    binutils2.14make3.79.1-17
    cpp3.3.3make-doc3.79.1-17
    gcc3.3.3mkcramfs0.0.1
    gcc-c++3.3.3mkimage1.1.3
    gdb5.2.1-4bmtd_utils2-1
    genext2fs1.3rpm4.1.1-1.8xa
    ldd0.1rpm-build4.1.1-1.8xa
    • 如果需要安装Linux开发主机版本的ELDK,可以执行如下命令:
    • $chmod+x install
    • ./install [-d <dir>] [<cpu_family1>] [<cpu_family2>] ...
    • 其中,(1)[ -d < dir >]表示安装的目录,如果不设置则表示安装在当前目录;
    • (2)<cpu_family>:表示需要安装的目录CPU的类型。
    • 可将ELDK安装到任何目录,注意需要具有写和执行的权限,并不需要由root权限。
    • ELDK是基于RPM结构的,表明每个ELDK的元件都是一个个的RPM文件,它们可以安装或者删除。
    • (1)罗列出已经安装的ELDK元件包的指令为:
    • ${CROSS_COMPILE}rpm -aq
    • (2)删除一个元件包的指令为:
    • ${CROSS_COMPILE}rpm -e <package_name>
    • (3)安装一个元件包指令为:
    • ${CROSS_COMPILE}rpm -i <package_file_name>
    • (4)更新一个元件包的指令为:
    • ${CROSS_COMPILE}rpm -U <package_file_name>
    • 如果要删除ELDK,则只需要删除ELDK安装的目录即可:
    • $rm -rf <dir>
    • 其中,< dir >表示ELDK安装的目录。
    • 注意,在执行上述命令前一定要配置好正确的ELDK环境变量。设置CROSS_COMPILE的环境变量,并添加ELDK的bin和usr/bin路径到系统的PATH环境变量中。CROSS_COMPILE将区分x86主机的gcc工具和安装的ELDK的ARM的gcc交叉编译工具。下面为一个安装并配置ELDK的例子:
    • (1)建立ELDK的安装目录:
    • $mkdir /opt/eldk
    • (2)将安装程序载入光盘:
    • $mount /dev/cdrom /mnt/cdrom
    • (3)运行install脚本,安装ELDK到指定的目录:
    • $/mnt/cdrom/install -d /opt/eldk
    • (4)安装完成后,输出CROSS_COMPILE环境变量:
    • $export CROSS_COMPILE=arm-linux-
    • (5)在PATH环境变量中加入/opt/eldk/usr/bin和/opt/eldk/bin目录:
    • $PATH=$PATH:/opt/eldk/usr/bin:/opt/eldk/bin

    1.3 验证工具链

    • 安装了交叉编译工具链后,需要经过验证才能正式实用。下面是一个简单的程序“helloworld.c”:
    #include <stdio.h>
    int main(void)
    {
    	printf("hello world!\n");
    	return 0;
    }
    
    • 对于1.1节搭建好的交叉工具链进行编译,结果如下:
    • $arm-linux-gcc -o helloworld helloworld.c
    • $file helloworld
    • helloworld:ELF 32-bit LSB executable, ARM, version 1, dynamically linked (uses shared libs), not stripped
    • 上面的输出说明编译成功了一个能在ARM体系结构上运行“helloworld.c”,这就证明工具链已经搭建成功了。
    • 对于1.2节搭建好的工具链,可以进行一下编译进行验证:
    • ${CROSS_COMPILE}gcc -o helloworld helloworld.c
    • $file helloworld
    • helloworld:ELF 32-bit LSB executable, ARM, version 1, dynamically linked (uses shared libs), not stripped
    • 上面的输出证明ELDK安装成功。

    二、配置主机服务

    在嵌入式软件开发过程中,有些主机服务有时非常必要,这样会为开发工作开来便利,下面主要介绍4种主机服务:samba、DHCP、TFTP和NFS。

    2.1 配置samba

    • samba服务能够实现Linux和Windows之间的文件共享,方便于文件编辑,具体配置方法如下:
    • (1)修改samba配置文件“/etc/samba/smb.conf”:第一,修改interfaces=your ip/24;第二,添加开放的目录和权限,如下:
    [sharename]
    comment = Insert a comment here
    path = /home/share/
    valid users = root
    browseable = yes
    writable = yes
    printable = no
    create mode = 0664
    directory mode = 0775
    
    • (2)为samba创建一个单独的口令文件,根据“/etc/passwd”文件来创建,在shell种输入命令:
    • $cat /etc/passwd | mksmbpasswd.sh > /etc/samba/smbpasswd
    • (3)改变samba口令文件的权限,只有根用户才有读写权限:
    • $chmod 600 /etc/samba/smbpasswd
    • (4)设置每个samba用户的口令,如下命令把username替换为每个用户的用户名:
    • $smbpasswd username
    • (5)加密口令必须在samba配置文件种被启用,在“smb.conf”文件种,请确定一下行没有被注释掉:
    encrypt passwords = yes
    smb passwd file = /etc/samba/smbpasswd
    
    • (6)在shell命令行输入“service smb restart”来确定samba服务被启动。
    • (7)为了避免每次启动都要手动启动samba服务,可使用如下命令在系统启动时自动启动samba服务:
    • $chkconfig smb on
    • 注意,使用samba服务之前,必须关闭Linux的防火墙功能。

    2.2 配置DHCP

    • DHCP是动态主机配置协议,这个协议用于向计算机自动提供IP地址,子网掩码和路由信息。在开发过程中,目标系统没有自己的静态IP地址,在启动时向DHCP服务器申请,因此需要在主机上配置DHCP服务,使得目标系统在请求IP地址时,动态地为它分配IP地址。
    • DHCP服务地配置文件为“etc/dhcpd.conf”,它通常包含三部分:parameters、declarations和option。
    • (1)DHCP配置文件地parameters(参数)表示是否和如何执行任务,即将那些网络配置选项发送给用户,parameters的主要内容如下表所示:
    参数含义
    ddns-update-style配置DHCP-DNS互动更新模式
    default-lease-time指定缺省租赁时间的长度(s)
    max-lease-time指定最大租赁时间的长度(s)
    hardware指定网卡接口类型和MAC地址
    sever-name通知DHCP客户服务器名称
    get-lease-hostnames flag检查客户端使用的IP地址
    fixed-address ip分配给客户端一个固定的地址
    authritative拒绝不正确的IP地址请求
    • (2)DHCP配置文件中的declarations(声明),用来描述网络布局、提供用户的IP地址等,declarations的主要内容如下表所示:
    声明解释
    shared-network用来告知是否一些子网络分享相同的网络
    subnet描述一个IP地址是否属于该子网
    range 起始IP终止IP提供动态分配IP地址的范围
    host主机名称参考特别的主机
    group为一组参数提供声明
    allow unknown-clients; deny unknown-client是否动态分配IP地址给未知的用户
    allow bootp; deny bootp是否响应激活查询
    allow booting; deny booting是否响应用户查询
    filename开始启动文件的名称,应用于无盘工作站
    next-server设置服务器从引导文件中装入主机名,应用于无盘工作站
    • (3)DHCP配置文件中的option(选项),用来配置DHCP可选参数,其主要内容如下表所示:
    选项解释
    subnet-mask为用户端设置子网掩码
    domain-name为用户端指明DNS名字
    domain-name-servers为用户端知名DNS服务器的IP地址
    host-name为用户端指定主机名称
    routers为用户端设定默认网关
    broadcast-address为用户端设定广播地址
    ntp-server为用户端设定网络时间服务器的IP地址
    time-offset为用户端设定与格林尼治时间的偏移时间(s)
    • 下面为一个典型的配置实例:
    ddns-update-style interim;
    ignore client-updates;
    allow bootp;
    
    subnet 192.168.1.0 netmask 255.255.255.0{
    	range dynamic-bootp 192.168.1.1 192.168.1.200;
    	default-lease-time 216000;
    	max-lease-time 432000;
    	# we want the nameserver to appear at a fixed address
    	host armlinux{
    		hardware ethernet 11:22:33:44:55:66;
    		fixed-address 192.168.1.20;
    		option root-path "/tftpboot";
    	}
    }
    
    • 重启DHCP服务,命令如下:
    • $service dhcpd restart
    • 为了避免每次启动主机都要手动启动DHCP服务,使用如下命令使得DHCP服务在每次系统启动时都默认执行:
    • $chkconfig dhcpd on

    2.3 配置TFTP

    • 在目标系统的开发过程中,Linux内核是从主机下载到目标系统上解压并运行的,因此主机必须提供这种文件传输功能。TFTP是一种简单的文件传输协议,多用于嵌入式系统应用中,因此主机需要配置TFTP服务,以供内核下载时使用。
    • (1)修改而皮质参数,TFTP服务的配置文件为“etc/xinetd.d/tftp”,只需要将server-args的参数设置为“-s/tftpboot”,/tftpboot为包含要下载到目标系统中去的Linux内核映射文件的目录,其他使用默认设置即可。
    • (2)在主机上创建/tftpboot目录,用于存放内核,命令如下:
    • $mkdir /tftpboot
    • (3)重启TFTP服务:
    • $service xinetd restart
    • (4)为了避免每次重启主机都要手动启动TFTP服务,使用如下指令实现TFTP服务在每次启动系统时都默认执行:
    • $chkconfig tftp on
    • 典型的TFTP配置文件如下:
    service tftp
    {
    	disable=no
    	socket-type=dgram
    	protocol=udp
    	wait=yes
    	user=root
    	server=/usr/sbin/in.tftpd
    	server-args=-s /tftpboot
    	per_source=11
    	cps=100 2
    	flags=IPv4
    }
    

    2.4 配置NFS

    • 网络文件系统(NFS)是一种在网络上及其间共享文件的方法,在开发过程中,目标系统没有足够的本地存储设备,可以通过主机提供NFS服务,使用在主机上的文件系统,就如同本地硬盘驱动器一样。
    • (1)修改NFS配置文件
    • NFS服务的配置文件为“etc/exports”,其格式如下:
    • 共享目录 主机名1或IP1(参数1,参数2) 主机名2或IP2(参数3,参数4)
    • 上面的格式表示:一个共享目录提供给两台不同的主机,但提供给这两台主机的权限和参数可以是不同的,可以设置的参数如下所示:
    • rw:可读写的权限;
    • ro:只读权限;
    • root_squash:root用户的所有请求映射为如匿名(anonymous)用户一样的权限;
    • no_root_squash:保留共享文件的UID和GID;
    • all_squash:共享文件的UID和GID映射匿名用户,适用于公共目录;
    • no_all_squash:保留共享文件的UID和GID;
    • sync:资料同步写入到内存和硬盘中;
    • async:资料会先暂存于内存中,而非直接写入硬盘;
    • secure:NFS通过1024个以下的安全TCP/IP端口发送;
    • insecure:NFS通过1024个以上的端口发送;
    • hide:在NFS共享目录不共享其子目录;
    • no_hide:共享NFS目录的子目录。
    • (2)重启NFS服务:
    • $service nfs restart
    • (3)为了避免每次启动时手动启动NFS服务,输入如下指令在启动机器时自动启动NFS:
    • $chkconfig nfs on
    • 典型的NFS配置文件如下:
    • /tftpboot *(rw, no_root_squash, no_all_squash)
    展开全文
  • 根据Redis官网的说明,Redis 4系列及其以上的版本支持ARM...下面以Redis 5.0.10版本为例,说明Redis在ARM上如何编译,本人使用的是交叉编译环境。 1.在Redis官网下载Redis的源码包,如5.0.10版本源码包的路径为: http
  • RISC-V 交叉编译环境,快学起来吧!交叉编译(Cross Compile)编译代码的平台,和执行编译后源代码的平台是两个不同的平台,比如在 x86/Linux 平台下使用交叉编译工具链编译 ARM/Linux 平台下的可执行文件。今天...
  • 本文基于ubuntu,搭建交叉编译环境,arm64为例,交叉编译4.19.186内核源码 所谓的交叉编译是:编译的平台环境与编译的成果所运行的平台,不是一类平台。通常X86平台下编译成果物,提供给arm下要运行的程序或内核。...
  • 交叉编译详解

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

    千次阅读 2011-05-16 11:08:00
    linux下的交叉编译环境重要包括以下几个部分: 针对目标系统的编译器gcc 针对目标系统的二进制工具binutils 目标系统的标准c库glibc 目标系统的linux内核头文件 交叉编译环境的建立步骤 下载源代码 下载包括
  • BeagleBone Black运行的linux中安装的gcc虽然可以编译程序。但是使用远程登陆的方式进行文本编辑毕竟不方便,而且嵌入式的arm处理器性能有限,编译简单的代码尚可,可如果代码稍微复杂就会非常的力不从心了。如果...
  • 交叉编译

    千次阅读 2020-09-16 20:35:39
    什么是交叉编译 交叉编译是在一个平台上生成另一个平台上的可执行代码(例如我们在windows上用keil编译代码生成hex文件,供51单片机使用,这个过程就是交叉编译。这是一个行为。)。 为什么要交叉编译 既然我们已经...
  • Golang交叉编译

    2021-12-27 10:17:17
    交叉编译在一个平台编译另一个平台的代码,如:Windows上面编译Linux平台的代码。         通常情况下某平台编译的代码只有该平台能够运行访问,若拷贝到其他平台可能...
  • Linux交叉编译环境搭建和内核编译

    千次阅读 2017-05-24 20:10:49
    a)要想在x86桌面平台对ARM架构的嵌入式CPU编译程序就需要用到交叉编译工具链,而交叉编译工具链一般都是在Linux环境下使用的,所以我们就需要在Ubuntu下安装: 注:本文使用的交叉编译工具链版本为 2012.03由嵌入式...
  • 在裁减和定制Linux,运用于你的嵌入式系统之前,由于一般嵌入式开发系统存储大小有限,通常你都要在你的强大的pc机上建立一个用于目标机的交叉编译环境。这是一个由编译器、连接器和解释器组成的综合开发环境。交叉...
  • 一、在树莓派和Ubuntu上配置Qt + OpenCV的交叉编译环境——2. Qt的交叉编译(带EGLFS支持)
  • gdb 交叉编译环境搭建

    2019-01-01 10:43:53
    1、下载gdb: 下载地址为: ... 下载最新版。我们以gdb-8.2.tar.gz 这个文件为例。 2、解压缩: ...$./configure --target=mips-linux --program-prefix=...需将GDB考入君正提供的开发环境中进行编译。否则会包各种错误。
  • Qt arm嵌入式交叉编译环境搭建

    千次阅读 2015-10-14 13:57:26
    刚接触linux系统和Qt,这个编译环境的搭建确实让人很是烦恼。经过一个多月时间的接触,基本搞定了,虽然有些东西还是不是太明白,这在做个总结。Qt的理解 首先得明白,qt就是一个C++类库。用的时候,我们是通过调用...
  • 由于ARM7/ARM9的处理器性能偏弱,而且配套的存储空间一般也不够打,所以大多数情况下都采用交叉编译开发的方式,具体实现的方式就是在x86-Linux平台下,下载安装一个交叉编译器。Ubuntu系统下安装交叉编译器可以通过...
  • ... 这段时间一直忙于手上的嵌入式项目,可以说自己从嵌入式的菜鸟一点点的入门了,...硬件的开发,搭建环境,是一个很大的工程量,也是很重要的一步,环境没有搭好就无法进行下一步。当然这个前提是对项目所
  • 交叉编译zeromq

    2020-04-26 20:59:03
    一:查看官网,是否支持arm32位,结论为支持。 二:源码zeromq-4.1.6.tar.gz放入虚拟机并解压 1.首先要阅读的就是README,然后看一下INSTALL文件,这个文件里编译源码包的步骤。... 对于交叉编译,主要就是有三...
  • 3.要点:设置交叉编译工具主要是设置PATH, ARCH和CROSS_COMPILE三个环境变量 4.确定源码和交叉编译工具链的目录,本文假设其目录为/home/book/ 二、本文一imx6ull pro开发板为例,进行配置环境变量 ①永久生效 vim ...
  • 交叉编译简析

    2020-09-02 22:48:41
    1 什么是交叉编译 在解释什么是交叉编译之前,先要明白什么是本地编译。 本地编译 本地编译可以理解为,在当前编译平台下,编译出来的程序只能放到当前平台下运行。平时我们常见的软件开发,都是属于本地编译: 比如...
  • Go交叉编译

    2020-05-17 14:52:11
    交叉编译在一个硬件平台生成另一个硬件平台的可执行文件。而Go提供了非常方便的交叉编译方式。 如何编译 Go交叉编译,涉及到几个环境变量的设置: GOARCH、GOOS和CGO_ENABLED。 GOARCH:编译目标平台的...
  • 2. 解压NDK,并且配置环境变量 export PATH=/xxx/android-ndk-r20:$PATH 3. 编译特定平台的工具链(这里是x86) (1)在NDK的build/tools目录有make-standalone-toolchain.sh 的程序让用户创建标...
  • 接下来写个cmake脚本方便配置交叉编译环境,新建cmake脚本,~/home/raspberrypi3b+/pi.cmake 文件内容: SET(CMAKE_SYSTEM_NAME Linux) SET(CMAKE_SYSTEM_VERSION 1) SET(CMAKE_C_COMPILER $ENV{HOME}/raspberrypi/...
  • 交叉编译环境

    2014-03-04 16:36:50
    在嵌入式系统开发中,经常用到与交叉编译(cross compiling)相关的术语,那交叉编译到底是什么呢? 嵌入式系统往往资源都是很有限的,如果其资源和我们平常用的桌面计算机(在嵌入式系统开发中我们称之为主机...
  • 本文以嵌入式 Linux 环境下的 gdb 使用为例,记录交叉编译过程中一个比较关键的问题:configure 过程中 --build, --host, --target 参数的区别。 1. 交叉编译 交叉编译在一种平台上编译出运行于另一种平台的程序...
  • 交叉编译 OpenSSL

    2022-03-17 16:07:46
    交叉编译 openssl
  • 什么是“交叉编译

    2017-12-28 11:30:00
    1.1、高级编程语言是符合人类思维的被程序员直接用来编程语言(如C语言:使用特定语句直接实现诸如条件判断分叉执行、条件判断循环执行、加减乘除取余移位运算、与或非逻辑运算等。高级编程语言直接面向人类思维)...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 22,452
精华内容 8,980
关键字:

交叉编译环境是指