精华内容
下载资源
问答
  • 一、什么交叉编译 在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译。这个编译过程就叫交叉编译。简单地说,就是在一个平台上生成另一个平台上的可执行...

    一、什么是交叉编译

           在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译。这个编译过程就叫交叉编译。简单地说,就是在一个平台上生成另一个平台上的可执行代码。这里需要注意的是所谓平台,实际上包含两个概念:体系结构(Architecture)、操作系统(OperatingSystem)。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。举例来说,我们常说的x86 Linux平台实际上是Intel x86体系结构和Linux for x86操作系统的统称;而x86 WinNT平台实际上是Intel x86体系结构和Windows NT for x86操作系统的简称。

          交叉编译这个概念的出现和流行是和嵌入式系统的广泛发展同步的。我们常用的计算机软件,都需要通过编译的方式,把使用高级计算机语言编写的代码(比如C代码)编译(compile)成计算机可以识别和执行的二进制代码。比如,我们在Windows平台上,可使用Visual C++开发环境,编写程序并编译成可执行程序。这种方式下,我们使用PC平台上的Windows工具开发针对Windows本身的可执行程序,这种编译过程称为native compilation,中文可理解为本机编译。然而,在进行嵌入式系统的开发时,运行程序的目标平台通常具有有限的存储空间和运算能力,比如常见的ARM 平台,其一般的静态存储空间大概是16到32MB,而CPU的主频大概在100MHz到500MHz之间。这种情况下,在ARM平台上进行本机编译就不太可能了,这是因为一般的编译工具链(compilation tool chain)需要很大的存储空间,并需要很强的CPU运算能力。为了解决这个问题,交叉编译工具就应运而生了。通过交叉编译工具,我们就可以在CPU能力很强、存储控件足够的主机平台上(比如PC上)编译出针对其他平台的可执行程序。

          要进行交叉编译,我们需要在主机平台上安装对应的交叉编译工具链(crosscompilation tool chain),然后用这个交叉编译工具链编译我们的源代码,最终生成可在目标平台上运行的代码。常见的交叉编译例子如下:
     
    1、在Windows PC上,利用ADS(ARM 开发环境),使用armcc编译器,则可编译出针对ARM CPU的可执行代码。
     
    2、在Linux PC上,利用arm-linux-gcc编译器,可编译出针对Linux ARM平台的可执行代码。
     
    3、在Windows PC上,利用cygwin环境,运行arm-elf-gcc编译器,可编译出针对ARM CPU的可执行代码。

    二、为什么要使用交叉编译

    有时是因为目的平台上不允许或不能够安装我们所需要的编译器,而我们又需要这个编译器的某些特征;有时是因为目的平台上的资源贫乏,无法运行我们所需要编译器;有时又是因为目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器。


    原文链接:http://blog.csdn.net/mars1743/article/details/20492285

    展开全文
  • 交叉编译

    2020-12-04 11:17:27
    目录交叉编译什么什么交叉编译交叉编译工具链的安装临时配置环境变量永久配置环境变量检验目标机使用上位机交叉编译后的文件 交叉编译什么 交叉编译:在一个平台上生成另一个平台上的可执行代码 在winnods...

    交叉编译是什么

    交叉编译:在一个平台上生成另一个平台上的可执行代码

    • 在winnods上面编写C51代码,并编译成可执行代码,如xx.hex,是在C51上运行而不是在windows上面运行
    • 在linux上编写树莓派的代码,并编译生成可执行代码,如a.out,是在是树莓派上面运行,不是在ubuntu linux上运行

    编译:是在一个平台上生成在该平台上的可执行代码
    C51交叉编译是发生在keil上(集成环境上面已经做好)

    通俗的来说,交叉编译就是在pc(x86架构)上的代码,通过相应的交叉编译工具链编译后,能在树莓派上运行(arm架构)。

    为什么要交叉编译

    • 平台上不允许或不能够安装我们所需要的编译器,或者平台都没有建立
    • 连操作系统都没有,根本谈不上运行什么编译器

    比如C51,内存很小,没办法运行安装编译器。

    树莓派是否需要交叉编译
    树莓派刚画出来的时候平台还没有建立,操作系统都没偶,而操作系统也是代码,也需要编译。

    平台运行需要至少两样东西:bootloader(启动引导代码),以及操作系统核心

    • 宿主机(host) :编辑和编译程序的平台,一般是基于X86的PC机,通常也被称为主机。
    • 目标机(target):用户开发的系统,通常都是非X86平台。host编译得到的可执行代码在target上运行。 prefix:交叉编译器的安装位置。

    交叉编译用到的工具:交叉编译器、交叉编译工具链
    keil选择芯片的原因:选择交叉编译器

    交叉编译工具链的安装

    https://releases.linaro.org/components/toolchain/binaries/4.9-2017.01/arm-linux-gnueabihf/
    linaro公司出的交叉编译工具链非常的好用,可以更具自己的需要使用自己需要的
    在这里插入图片描述
    gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz
    就是在x86架构上使用的,可以编译后放在arm架构上运行的交叉编译工具链

    https://github.com/raspberrypi/
    树莓派的交叉编译工具链在这里安装
    打开后点击右下角的tools
    再点击绿色按钮的小箭头下载
    下载好后用unzip指令进行解压
    在这里插入图片描述
    进入这个文件夹
    如果虚拟机时64位的,那么就进入x64的文件
    在这里插入图片描述
    再进入bin目录
    在这里插入图片描述
    可以看到很多可执行文件,再linux中可执行文件都是绿色的在这里插入图片描述
    我们要使用的工具就是这个蓝色的工具
    蓝色的是叫做软链接

    ls -l
    

    在这里插入图片描述

    它实际用到的可执行文件是后面指向的哪个可执行文件
    软连接是不占内存的,它只是指向哪个位置

    ./arm-linux-gnueabihf-gcc -v
    

    使用这个指令就可以使编译的文件再另一个平台运行
    但是这个文件藏得很深,每次用起来特别麻烦,这就需要用到环境变量的配置
    这个环境变量的意思和windows环境变量的意思使一模一样的
    就是把路径放进去,系统能直接识别这个路径下的指令

    临时配置环境变量

    查看环境变量指令: echo $PATH
    配置环境变量:
    在我们需要的路径下输入指令:export PATH=$PATH:/xxxxxxxxxxxx
    xxxxx为pwd的路径
    export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/chenhao/chenhao/lessonPi/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
    接下来cd回到工作目录
    在这里插入图片描述
    成功识别
    但这是临时配置,关机或者在另外的窗口就没有办法使用,这时候就需要永久配置

    永久配置环境变量

    修改工作目录下的.bashrc 隐藏文件,它是用来配置终端命令的
    输入vim /home/chenhao/.bashrc
    在最后一行加入
    在这里插入图片描述
    最后再输入source .bashrc 使其生效

    检验

    检验一下版本
    在这里插入图片描述
    只有4.8.3的版本的交叉编译工具才能够编译树莓派的文件
    系统默认的使4.5的,不够用
    使用
    使用file指令来查看文件属性
    这个只有x86-64的电脑上运行,树莓派上就跑不动在这里插入图片描述
    使用交叉编译工具在这里插入图片描述
    编译出来的可执行文件就能再arm开发板上运行在这里插入图片描述
    可以看出,能在arm板子上运行的可执行文件不能在x86-64的电脑运行

    目标机使用上位机交叉编译后的文件

    接着使用scp指令将这个文件传到树莓派的目录中在这里插入图片描述
    在这里插入图片描述
    发现树莓派端收到了这个可执行文件,并且可以执行

    scp clientPI pi@   ip地址    :/home/pi
    

    再传一个只能再x86-64电脑上运行的文件
    在这里插入图片描述
    在这里插入图片描述
    树莓派端收到文件,但是无法解析此文件
    树莓派无法运行

    展开全文
  • 什么交叉编译

    千次阅读 2018-01-18 15:51:46
    交叉编译或许我们工作中经常会听到别人提起,那到底是什么意思呢? 如果你是使用动态语言的那么你不需要编译,只是需要安装一个解释器。 定义 代码变成可执行文件,叫做编译(compile);先编译这个,还是先...

    交叉编译或许我们工作中经常会听到别人提起,那到底是什么意思呢?

    如果你是使用动态语言的那么你不需要编译,只是需要安装一个解释器。

    定义

    代码变成可执行文件,叫做编译(compile);先编译这个,还是先编译那个(即编译的安排),叫做构建(build)

    在一个机器上可以编译其他平台所用的任务,称为交叉编译。举个例子,我们使用Linux 可以直接编译出在Windows或者Mac上使用的软件。

    展开全文
  • 5.2.1 非交叉编译 gcc是ubuntu系统(linux操作系统内核)下面用来将代码编译成一个可执行程序的手段。编译出来的是适用于linux系统的可执行二进制文件。 gcc编译: gcc -c hello.c -o hello 例: 注意:单gcc表示...

    5.2 gcc编译

    5.2.1 非交叉编译

    gcc是ubuntu系统(linux操作系统内核)下面用来将代码编译成一个可执行程序的手段。编译出来的是适用于linux系统的可执行二进制文件。
    gcc编译:

    gcc -c hello.c -o hello
    

    例:
    在这里插入图片描述
    注意:单gcc表示非交叉编译,编译出来的可执行文件hello,只能在当前主机(x86架构)上运行。
    为何能直接运行gcc命令,因为在/usr/bin/下存在gcc运行程序,并且/usr/bin/已存于环境变量$PATH中。
    在这里插入图片描述
    注意:若程序中使用了pthread_create函数,包含了头文件#include <pthread.h>。
    使用gcc xxx.c -o xxx编译时会出现以下错误:
    在这里插入图片描述
    原因:用gcc编译使用了POSIX thread的程序时通常需要加额外的选项,以链接到库。此处直接加上-lpthread选项。

    gcc xxx.c -o xxx -lpthread
    

    5.2.2 交叉编译

    arm-linux-gcc是什么意思?就是告诉你的编译器,我编写的环境是linux,但是我希望生成的可执行程序是在arm上面跑的。
    

    若想编译出的可执行文件要在目标机(arm或其它)上运行,则需要使用指定的交叉编译工具去编译。
    如高通8953平台的交叉编译工具:
    /mnt/external/wangtao/8953/8953_APP_P/prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin/arm-eabi-
    例:
    客户提供了他们的编译工具,需要我们编译一个抓log的应用程序。如下,4.1.0-uclibc-0.9.28文件夹 == 客户的交叉编译工具
    nwy_qxdm_logger_v1219.c == 抓log的应用程序源文件
    在这里插入图片描述
    编译方式1:
    (1)将客户的编译工具输出编译环境变量:
    export PATH=/mnt/external/wangtao/linux-qxdm/home/xiaoxiaxia/4.1.0-uclibc-0.9.28/4.1.0-uclibc-0.9.28/bin:$PATH
    在这里插入图片描述
    变量目录的内容具体如下,运行mipsel-linux-gcc命令就可以在环境变量中找到。
    在这里插入图片描述
    (2)编译(说明客户用的是mipsel架构系统):

    mipsel-linux-gcc -c nwy_qxdm_logger_v1219.c -o nwy_qxdm_logger_v1219
    

    编译方式2:
    (1)编写makefile,其中定义CROSS_COMPILER为客户提供的交叉编译工具路径:

    CROSS_COMPILER=/mnt/external/wangtao/linux-qxdm/home/xiaoxiaxia/4.1.0-uclibc-0.9.28/4.1.0-uclibc-0.9.28/bin/mipsel-linux-
    CC=$(CROSS_COMPILER)gcc
    
    SRCS = $(wildcard *.c) 
    
    OBJS = $(SRCS:.c = .o)
    
    LIBS = -lpthread -ldl
    
    CCFLAGS = -g -W -D_GNU_SOURCE
    
    OUTPUT = nwy_qxdm_logger
    
    all:$(OUTPUT)
    
    $(OUTPUT) : $(OBJS)
        $(CC) $^ -o $@ $(LIBS) $(CCFLAGS)
    
    %.o : %.c
        $(CC) -c $< $(CCFLAGS)
    
    clean:
        rm -rf nwy_qxdm_logger *.o 
    
    .PHONY:clean
    

    (2)直接make,会根据makefile进行编译。

    展开全文
  • 从零搭建交叉编译
  • arm交叉编译详解

    万次阅读 2016-11-03 14:38:35
    转载自 交叉编译详解–版本:v1.3.0, 有修改 CSDN GitHub arm交叉编译详解 ...本文主要介绍了什么交叉编译,为何要有交叉编译;解释了什么是工具链,什么是交叉工具链;详解解释了交叉编译器的名
  • 1、什么交叉编译 1.1 本地编译  解释什么交叉编译之前,先要明白一个概念:本地编译  我们之前常见的软件开发,都是属于本地编译:在当前的PC下,x86的CPU下,直接编译出来程序,可以运行的程序(或者库文件)...
  • 老是在做交叉编译,其实有时候对这三个东西的理解并不是那么清楚   从交叉工具链的情况来看,可以总结如下 --build= 谁在这里编译? 意思说你目前的编译动作在哪里跑的 ? 如果是编译一个arm工具链,虽然工具链...
  • 交叉编译相关知识

    2018-04-16 16:38:23
    交叉编译概念 交叉编译时一种和本地编译相对的概念,用来区分编译环境和运行环境。...为什么要有交叉编译 在嵌入式开发过程中,嵌入式系统中并没有足够的资源进行代码的编译操作,也装不下编...
  • 交叉编译知识简介

    2017-11-01 14:49:43
    一,何为交叉编译? 我们需要在arm芯片的板子上运行程序,该程序就需要在x86芯片上通过交叉编译的方式,编译出一个arm架构的程序。 二,如何交叉编译? 1、我们编译一个x86的程序使用的是gcc,而交叉编译则...
  • 交叉编译详解

    千次阅读 2016-10-23 08:27:34
    本文主要介绍了什么交叉编译,为何要有交叉编译;解释了什么是工具链,什么是交叉工具链;详解解释了交叉编译器的名字的命名规则,以及如何获得交叉编译器,制作交叉编译器的各种工具,使用已有的交叉编译器和自己...
  • FFmpeg交叉编译

    2019-10-11 14:52:54
    FFmpeg ndk最新的发布版是r17,如果只能找到r16的下载地址,那只要把这个地址中的16改成17就可以了 ...FFmpeg是一个开源的音...如果需要在Android中使用这个库,那就需要进行交叉编译。 从官网下载FFmpeg的源码: ...
  • 交叉编译入门

    2020-02-25 22:15:55
    通过这篇文章了解c/c++编译器的基本使用,能够在后续移植第三方框架进行交叉编译时(编译android可用的库),清楚的了解应该传递什么参数,怎么传递参数给编译器,各个参数的意义是什么,从而为后面音视频的深入学习...
  • 交叉编译工具链详解

    2021-08-19 13:43:15
    交叉编译什么,为什么交叉编译 一、 是什么 交叉编译是在一个平台上生成另一个平台上的可执行代码。 例如 1、我们在windows上面编写C51代码,并编译成可执行文件代码,如xx.h在C51上面运行,然后在C51上面运行...
  • mysql交叉编译方式

    2021-01-04 20:21:41
    mysql 交叉编译的过程主要是通过 cmake 生成相应的配置文件与 Makefile,然后再执行 Makefile 脚本文件生成相应的目标文件。
  • 交叉编译什么交叉编译是一个行为,是在一个平台上生成另一个平台上的可执行代码。 比如:我们在windows上面编写C51的代码,并编译成可执行代码,如xx.hex,是在C51上面运行不是在windows上面运行。 同样:我们在...
  • Golang 交叉编译

    2019-10-14 16:52:20
    Golang 支持交叉编译,在一个平台上生成另一个平台的可执行程序,最近使用了一下,非常好用,这里备忘一下。 需要注意的是我发现golang在支持cgo的时候是没法交叉编译的 Mac 下编译 Linux 和 Windows 64位可执行...
  • 这是什么意思呢? ARCH 即architecture,就是选择编译哪一种cpu architecture,也就是编译arch/目录下的哪一个子目录。如指定make ARCH=arm就是编译arch/arm下的代码。如果不指定,make将使用本机(用什么机器编译...
  • 树莓派之交叉编译

    千次阅读 2017-02-13 14:49:15
    1 为什么要使用交叉编译  交叉编译工具较快开发的速度。树莓派中已经安装了gcc工具链,可在树莓派中直接编译源代码生成可执行文件。于此同时,PC机上也可使用gcc工具链生成可执行代码,但是和树莓派上的gcc工具...
  • go交叉编译

    2019-05-15 17:17:24
    场景 window,linux为例, 在windows系统中执行go build,产生不同的结果 ...windows编译 64位编译指令: GOOS=windows GOARCH=amd64 go build 32位编译指令: GOOS=windows GOARCH=386 go build linux编译 386编译...
  • 自己动手编译交叉编译

    千次阅读 2019-03-09 21:54:07
    这篇文章主要记录一下自己编译 交叉编译链工具的过程。其实很多工作都是别人已经帮我们做好了的,我只是使用一下别人做好的工具。 编译的过程中,主要使用到的工具是:crosstool-ng 编译的流程主要是: 1、先编译...
  • lsof交叉编译

    千次阅读 2013-07-23 19:50:50
    交叉编译 1 下载 网上搜索lsof-4.80.tar.gz 2.解压 tar -zxvf lsof-4.80.tar.gz cd lsof_4.80 tar -xvf lsof_4.80_src.tar  3.根据/lsof-4.80/lsof_4.80_src/00XCONFIG文件设置环境变量 export LSOF_CC="/...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,051
精华内容 7,220
关键字:

交叉编译什么意思