交叉编译器的安装方法

2023-11-11

  首先简单介绍一下,所谓的搭建交叉编译环境,即安装、配置交叉编译工具链。在该环境下编译出嵌入式Linux系统所需的操作系统、应用程序等,然后再上传到目标机上。

       交叉编译工具链是为了编译、链接、处理和调试跨平台体系结构的程序代码。对于交叉开发的工具链来说,在文件名称上加了一个前缀,用来区别本地的工具链。例如,arm-linux-表示是对arm的交叉编译工具链;arm-linux-gcc表示是使用gcc的编译器。除了体系结构相关的编译选项以外,其使用方法与Linux主机上的gcc相同,所以Linux编程技术对于嵌入式同样适用。不过,并不是任何一个版本拿来都能用,各种软件包往往存在版本匹配问题。例如,编译内核时需要使用arm-linux-gcc-4.3.3版本的交叉编译工具链,而使用arm-linux-gcc-3.4.1的交叉编译工具链,则会导致编译失败。

        那么gcc和arm-linux-gcc的区别是什么呢?区别就是gcc是linux下的C语言编译器,编译出来的程序在本地执行,而arm-linux-gcc用来在linux下跨平台的C语言编译器,编译出来的程序在目标机(如ARM平台)上执行,嵌入式开发应使用嵌入式交叉编译工具链。

 

        交叉编译器的安装方法,通常交叉编译器的打包发布方式有关:
>> 如果以 deb 包形式发布,则需要用 dpkg 命令进行安装。示例命令:
host$ dpkg -i package.deb
>>如果以 bin 方式打包发布,通常则需要为该文件加上可执行权限,然会运行这个文
件,完成安装
。示例命令:
host$ chmod +x package.bin
host$ ./package.bin
>>如果以.tar.bz2 压缩包方式发布,则只需在某个目录下进行解压即可。
host$ tar xjvf package.tar.bz2
以上 3 条命令中,在实际中须将 package 替换为实际文件名称。
由于以 deb 或者 bin 方式发布的工具链对不同版本的操作系统适应性较差,所以大多数
都采用.tar.bz2 这样的压缩包形式发布,下面重点讲述这种工具链的安装方法。

 

1.下载arm-linux-gcc-3.4.1.tar.bz2到任意的目录下,我把它下载到了我的个人文件夹里 /home/satellite 

arm-linux-gcc-3.4.1.tar.bz2 的下载地址如下:

http://www.handhelds.org/download/projects/toolchain/arm-linux-gcc-3.4.1.tar.bz2

 

2. 解压 arm-linux-gcc-3.4.1.tar.bz2

   #tar -jxvf arm-linux-gcc-3.4.1.tar.bz2

 

3. 修改环境变量,把交叉编译器的路径加入到PATH。

        方法一:临时设置系统环境变量,是通过 export 命令,将交叉编译器的路径添加到系统 PATH 环境变量中。用法(多个值之间用冒号隔开):

host$ export PATH=$PATH:/交叉编译器路径

紧接前面这个示例,在添加交叉编译器路径前,先查看系统 PATH 的值:

chenxibing@linux-compiler: ~$ echo $PATH

/home/chenxibing/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

添加工具链路径:

$ export PATH=$PATH:/home/ctools/arm-2011.03/bin/
再次查看 PATH 的值:
chenxibing@linux-compiler: ~$ echo $PATH
/home/chenxibing/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games: /home/
ctools/arm-2011.03/bin/
可以看到,交叉编译器的路径已经被添加到系统 PATH 变量中。此时在终端输入arm-none-linux-gnueabi-,然后按键盘 TAB 键,可以看到很多 arm-none-linux-gnueabi-开头的
命令被列了出来,说明系统已经能够正确找到交叉编译器了。
chenxibing@linux-compiler: ~$ arm-none-linux-gnueabiarm-none-linux-gnueabi-addr2line     arm-none-linux-gnueabi-cpp           arm-none-linux-gnueabi-gcov       
arm-none-linux-gnueabi-nm        arm-none-linux-gnueabi-size      arm-none-linux-gnueabi-ar         
arm-none-linux-gnueabi-elfedit       arm-none-linux-gnueabi-gdb           arm-none-linux-gnueabi-objcopy    
arm-none-linux-gnueabi-sprite    arm-none-linux-gnueabi-as            arm-none-linux-gnueabi-g++        
arm-none-linux-gnueabi-gdbtui        arm-none-linux-gnueabi-objdump       arm-none-linux-gnueabi-strings
arm-none-linux-gnueabi-c++           arm-none-linux-gnueabi-gcc          arm-none-linux-gnueabi-gprof      
arm-none-linux-gnueabi-ranlib        arm-none-linux-gnueabi-strip    arm-none-linux-gnueabi-c++filt    
arm-none-linux-gnueabi-gcc-4.5.2     arm-none-linux-gnueabi-ld            arm-none-linux-gnueabi-readelf
这种方法设置环境变量,只能对当前终端有效,关闭终端再次打开将会失效,需要重新设置。

        方法二:修改全局配置文件 

        在终端中添加环境变量,需要每次打开终端都设置,也很麻烦。可以考虑将设置的过程添加到系统配置文件中。/etc/profile 是系统全局的配置文件,在该文件中设置交叉编译器的路径,能够让登录本机的全部用户都可以使用这个编译器。
        打开终端,输入“sudo vi /etc/profile”命令,打开/etc/profile 文件,在文件末尾添加:
export PATH=$PATH:/home/ctools/arm-2011.03/bin/

        然后输入“. /etc/profile”(点+空格+文件名),执行 profile 文件,使刚才的改动生效。如果没有书写错误,此时打开终端,输入 arm-none-linux-gnueabi-,然后按键盘 TAB 键,同样可以看到很多 arm-none-linux-gnueabi-开头的命令。

        方法三:修改用户配置文件

        “/etc/profile”是全局配置文件,会影响登录本机的全部用户。如果不希望影响其他用户,也可以只修改当前用户的配置文件,通常是“~/.bashrc”或者“~/.bash_profile”。
修改方法与修改“/etc/profile”类似,这是无需 sudo,直接 vi 打开即可,在文件末尾增加:
export PATH=$PATH:/home/ctools/arm-2011.03/bin/
        与执行“/etc/profile”的方式一样,输入“. .bashrc”或者“. .bash_profile”,执行修改过的文件,使修改生效。如果无误,打开终端,输入 arm-none-linux-gnueabi-,然后按键盘 TAB键,同样可以看到很多 arm-none-linux-gnueabi-开头的命令。

 

4. 立即使新的环境变量生效,不用重启电脑:

                 对应方法一:#source /root/.bashrc

                 对应方法二:# source /etc/profile

5. 检查是否将路径加入到PATH:

                 # echo $PATH

  显示的内容中有/usr/local/arm/bin,说明已经将交叉编译器的路径加入PATH。至此,交叉编译环境安装完成。

6. 测试是否安装成功

   # arm-linux-gcc -v  

上面的命令会显示arm-linux-gcc信息和版本

 

7.编译

Hello World程序,测试交叉工具链

写下下面的Hello World程序,保存为

hello.c

   #include 

    int main()

    {

    printf("Hello World!\n");

       return 0;

    }

执行下面的命令:

    # arm-linux-gcc -o hello hello.c  

        源程序有错误的话会有提示,没有任何提示的话,就是通过了,就可以下载到ARM目标板上运行了!接着可以输入file hello的命令,查看生成的hello文件的类型,要注意的是生成的可执行文件只能在ARM体系下运行,不能在其于X86的PC机上运行。

 

        但是事情总有例外,很有可能在终端输入
arm-none-linux-gnueabi-gcc 命令后,得到的却是下面的结果:

-bash: ./arm-none-linux-gnueabi-gcc:  没有那个文件或目录
此时请确认:

(1)  在某个目录下确实存在 arm-none-linux-gnueabi-gcc 文件;
(2)  在终端输入 arm-none-linux-gnueabi-,按 TAB 键,能找到 arm-none-linux-gnueabi-*系列命令。

        如果这两个条件都确认无误,那么问题就好解决了。这种问题主要发生在 64 位操作系统上,原因在于大多数交叉编译器为了适应性,通常以 32 位发布,而实际系统是 64 位的,存在架构差异,所以不能执行。解决办法很简单,安装 32 位兼容库就好了。在 Ubuntu 12.04 上的安装命令:

$sudo apt-get install ia32-libs
>> 32 兼容库需要从 Ubuntu 的源下载,所以此时主机系统应当能访问互联网。
>> 在 Ubuntu 12.04 64 位下安装 32 位库的名字为 ia32-libs,在其它版本的 Ubuntu名称可能有变

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

交叉编译器的安装方法 的相关文章

  • STM32+ESP8266+MQTT连接阿里云(1)

    ESP8266连接阿里云的流程 发送 目的是让ESP8266退出透传 AT RESTORE 让模块恢复出厂设置 AT 判断模块的好坏及工作状态 正常就会回复OK ATE0 关闭回显 这个没什么好说的 AT CWMODE CUR 1 设置为s
  • FPGA硬件工程师Verilog面试题(基础篇二)

    作者简介 大家好我是 嵌入式基地 是一名嵌入式工程师 希望一起努力 一起进步 个人主页 嵌入式基地 系列专栏 FPGA Verilog 习题专栏 微信公众号 嵌入式基地 FPGA硬件工程师Verilog面试题 二 习题一 多功能数据处理器
  • Qt creator4.8.0 以上使用SqLite数据库进行数据操作

    文章目录 前言 一 在 pro工程文件中添加sql模块 二 使用步骤 1 添加头文件 2 链接并打开数据库 3 创建用户信息表management info 4 插入数据操作 5 修改数据库操作 6 查询数据库 总结 前言 Qt creat
  • 树莓派4B(buster)的源更换为北外(清华)国内源

    树莓派4B buster 的源更换为北外 清华 国内源 1 登陆到树莓派 ssh pi your raspi IP 2 备份源文件 sudo cp etc apt sources list etc apt sources list bak
  • 树莓派体验3 - SSH登录树莓派

    如果没有HDMI转接线 显示器 USB转TTL串口线 那么可以通过网络SSH远程登录的方式访问树莓派 无显示器使用SSH访问 开启SSH服务 首先 通过镜像版本号确认一下SSH是否默认开启 树莓派官网的release note中说明 201
  • modbus总线协议(一)modbus rtu

    一 介绍 Modbus协议由Modicon公司开发出来 现在Modbus是工业领域全球最流行的协议 硬件支持RS 232 RS 422 RS 485和以太网设备 应用在PLC DCS 智能仪表等工控领域 图片来源于网络 二 modbus协议
  • esp32cam门禁系统简易教程

    esp32cam门禁系统简易教程 人脸识别 1 环境安装 最好有梯子 arduino IDE 1 官网下载地址 选择相应版本下载Windows ZIP file 无脑安装 2 配置IDE 打开IDE 文件 gt 首选项 gt 附加开发板管理
  • 嵌入式 ARM 汇编编程例题

    文章目录 用汇编语言实现 128 位数的减法 已知 32 位变量 X Y 存放在存储器的地址 0x90010 0x90014 中 要求实现 Z X Y 其中 Z 的值存放在 0x90018 中 已知 32 位有符号数 X 存放在存储器的地址
  • MSP430嵌入式接口编程(惯性测量单元温湿度双音多频磁力计LCD显示等)

    Energia IDE编程MSP430 GPIO 串口通讯 定时中断 添加库 嵌入式器件接口编程 加速度计 include
  • 按键的短按和长按检测

    方法一 常用的加延时函数 在中断服务函数中加一个比如10ms的延时函数 延时时间的长短取决于实际所用的按键特性 只要延时时间比抖动时间略大即可 原理很简单 加了延时就避开了抖动的这段时间 在延时之后判断引脚电平 如果为低电平就表示是按下 v
  • keil mdk代码提示与代码补全设置

    主要参考https blog csdn net w5862338 article details 50520423 结合自己的实际问题 一旦习惯了一些实用的功能 当进入到类似的环境中而没有熟悉的功能 会觉得很不方便 代码提示与补全就是这样实
  • 在vmware里面看不到已经设置的共享文件夹

    查看你是否设置了共享文件夹 vmware hgfsclient 在上图的虚拟机点击安装vmware tools 之后会在vmware tools文件里面有一个压缩的文件 把它复制到自己创的文件夹并解压 自己创建文件夹使用mkdir p mo
  • 四位数显表头设计

    去年帮别人定制了一个四位数显小表头 可以用于测量4 20mA或者0 5V 0 10V输出的的各种传感器 可设置显示范围 上下限报警灯 由于后面更改方案 此方案暂时搁置不用 今天来分享一下软硬件的设计过程 1 硬件设计 1 1电源 电源采用一
  • 树莓派4B安装详细教程,从零开始!

    树莓派4B安装详细教程 从零开始 前言 一 准备材料 1 硬件材料 2 软件材料 二 安装步骤 1 格式化SD卡 2 安装系统 三 安装完成 前言 提示 本文详细介绍树莓派4B的安装流程 适合刚入手树莓派的同学 认为我写的好的同学希望点赞关
  • [Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL s...

    Err 1064 You have an error in your SQL syntax check the manual that corresponds to your MySQL server version for the rig
  • 物联锁项目失败原因分析

    一 背景 2022年3月份接手IM024物联锁项目救火 此项目主要用于医院共享轮椅 共享病床 此项目是从2021年初开始立项开发 投入了大量的人力物力 但是在2022年3月份时产品工作仍然不稳定 此项目基本上可以判定为一个失败的典型 为了吸
  • Oracle块损坏处理(MOS)

    处理 Oracle 块损坏 文档 ID 1526911 1 适用于 Oracle Database Enterprise Edition 版本 7 0 16 0 到 11 2 0 2 0 发行版 7 0 到 11 2 本文档所含信息适用于所
  • 嵌入式资源网站

    原题地址 http blog csdn net ce123 article details 6724127 一 MailList 1 MailList大全 网址 http news gmane org 描述 可以查到绝大部分开源项目的Mai
  • 计算机基础:一颗芯片是怎样诞生的?

    一颗芯片是怎样诞生的 芯片属于半导体 半导体是介于导体和绝缘体之间的一类物质 元素周期表中硅 锗 硒 硼的单质都属于半导体 这些单质通过掺杂其他元素生成的一些化合物 也属于半导体的范畴 这些化合物在常温下可激发载流子的能力大增 导电能力大大
  • 锂电池管理系统(BMS)

    引言 在现代科技的推动下 锂电池已经成为各种电动设备和能源存储系统的首选能源媒介 然而 锂电池在充电和放电过程中存在一系列潜在的安全隐患 同时其性能和寿命也受到一些限制 为了解决这些问题 锂电池管理系统 BMS 应运而生 BMS不仅仅是一个

随机推荐

  • unity +百度UNIT

    百度UNIT使用保姆级别 百度UNIT 的 API使用理解 具体理解如下 过程步骤 创建UNIT Access Token获取 UNIT API的调用 Unity 源码 效果 百度UNIT 的 API使用理解 具体理解如下 创建 UNIT
  • android Socket 长连接出错:android.system.ErrnoException: connect failed: ECONNREFUSED Connection refuse

    Android 端做Socket 长连接测试 报错 提示说连接被拒绝 java net ConnectException failed to connect to 192 168 0 101 port 8081 connect failed
  • 【HCIA】虚拟化技术介绍

    虚拟化技术介绍 虚拟化 Virtualization 的含义很广泛 将任何一种形式的资源抽象成另一种形式的技术都是虚拟化 是资源的一种逻辑表示 解除了物理硬件和操作系统之间的紧耦合关系 虚拟化是云计算的基础 简单地说 虚拟化使得在一台物理的
  • 卷积操作的填充和输出大小的公式

    输入图像大小为II 卷积核大小为kk 填充为p 步长为s 输出大小为O O 那么 如果输出不能对齐 常采用下采用
  • c语言中变量不初始化会怎么样?

    目录 变量初始化 未初始化 随机数的产生 产生原理 初始化必要性 问题来源 在日常学习结构体的语法时看到文章中用数组进行举例 进行输出 在讨论数组是否初始化 输出的值的问题 代码如下 include
  • CTFHUB-UA注入

    User Agent User Agent 通常就是用户的浏览器相关信息 例如 User Agent Mozilla 5 0 X11 Linux x86 64 rv 12 0 Gecko 20100101 Firefox 12 0 Hack
  • HTTP Status 500 An exception occurred processing JSP page

    问题代码 出现异常界面 从上图可知在19处出现了异常 主要有两处 以及 为了很好的解决以上错误 我们将依次把传进来的各个参数在tomcat控制台上打印输出 先看看结果 主要操作代码 控制台显示结果 从以上输出可看到getRemoteAddr
  • Object.keys()、Object.values()、Object.entries()详解

    在JavaScript中 Object keys 是一个内置函数 用于获取一个对象中所有可枚举属性的名称 并返回一个包含这些属性名称的数组 以下是使用Object keys 函数的示例 const obj a 1 b 2 c 3 const
  • 代码混淆后可能出现的问题

    1 ClassNotFoundException NoSuchMethodError 原因 这种异常会在好多情况下出现 比如 本地代码通过反射调用其他的类 但是经过了混淆之后 就会出现如上异常 调用了JNI之后 C或者C 和java代码进行
  • 前端面试题复习二

    组件中写 name 选项有什么作用 项目使用 keep alive 时 可搭配组件 name 进行缓存过滤 DOM 做递归组件时需要调用自身 name Vue devtools 调试工具里显示的组见名称是由 Vue 中组件 name 决定的
  • 战双服务器维护,战双帕弥什维护到几点 战双帕弥什维护什么时候结束

    战双帕弥什今日正式火爆开测 随着大量玩家的加入 服务器也难免出现了过载情况 很多玩家在登陆时出现了战双帕弥什提示服务器未开放请稍后再试的情况 那么战双帕弥什维护什么时候结束 战双帕弥什维护原因是什么 快一起了解一下吧 战双帕弥什维护原因 1
  • C++ 匿名对象的生命周期——强化训练(二)

    include
  • STM32F10X单片机学习之PWM.C代码注解

    include stm32f10x h Device header void PWM Init void RCC APB1PeriphClockCmd RCC APB1Periph TIM2 ENABLE 开启 APB1 外设总线上的外设时
  • Unity最新热更新框架 hybridclr_addressable

    GitHub YMoonRiver hybridclr addressable 开箱即用的商业游戏框架 集成了主流的开发工具 将主流的GameFramework修改 支持Addressable和AssetBundle 已完善打包工具和流程
  • “黑色星期五”数据分析实战

    项目背景 美国圣诞节大采购一般是从感恩节之后开始的 感恩节是每年11月的第四个星期四 因此它的第二天 也就是美国人大采购的第一天 在这一天 美国的商场都会推出大量的打折和优惠活动 以在年底进行最后一次大规模的促销 这有点类似于淘宝的双十一购
  • Java项目——文档搜索引擎

    文章目录 1 项目概述 2 准备阶段 2 1 项目创建 2 2 准备静态页面 3 搜索逻辑 4 分词 5 处理 HTML 文件 5 1 枚举文件夹中所有文件 5 2 预处理文件 5 2 1 获取标题 5 2 2 获取 URL 5 2 3 获
  • [VUE] 过滤器函数

    VUE 过滤器可以用在两个地方 双花括号插值和 v bind 表达式 代码如下 message capitalize div div 你可以在一个组件的选项中定义本地的过滤器 filters capitalize function valu
  • Apple Magic Mouse 卡顿的问题

    更新时间 2022 06 30 17 58 37 发现在公司使用就会很卡顿 在家里使用就很流畅 感觉还是公司信号被干扰了 更新时间 2022年06月13日 尝试过下面所以的方法 以及怀疑是键盘蓝牙干扰 把键盘关掉 最后的结论 都没什么卵用
  • opencv读写和保存中文路径图片及base64与图片互转

    文章目录 1 opencv读取中文路径图片 2 opencv保存中文路径图片 3 图片转base64 4 base64转图片 有几点要注意 cv2 imread filename flags cv2 imwrite filename img
  • 交叉编译器的安装方法

    首先简单介绍一下 所谓的搭建交叉编译环境 即安装 配置交叉编译工具链 在该环境下编译出嵌入式Linux系统所需的操作系统 应用程序等 然后再上传到目标机上 交叉编译工具链是为了编译 链接 处理和调试跨平台体系结构的程序代码 对于交叉开发的工