前言
在 Ubuntu 中开发基于 ARM 架构的 STM32 芯片,需要安装交叉编译器 gcc-arm-none-eabi编译代码,那么什么是交叉编译器呢?
Ubuntu 自带的 gcc 编译器是针对 X86 架构的!而我们现在要编译的是 ARM 架构的代码,所以我们需要一个在 X86 架构的 PC 上运行,可以编译 ARM 架构代码的 GCC 编译器,这个编译器就叫做交叉编译器,总结一下交叉编译器就是:
(1)它是一个 GCC 编译器;
(2)这个 GCC 编译器是运行在 X86 架构 PC 上的;
(3)这个 GCC 编译器是编译 ARM 架构代码的,也就是编译出来的可执行文件是在 ARM 芯片上运行的。
交叉编译器中“交叉”的意思就是在一个架构上编译另外一个架构的代码,相当于两种架构“交叉”起来了。
一、GNU Arm Embedded Toolchain简介
GNU Arm Embedded Toolchain 是用于 C、C++ 和汇编编程的即用型开源工具套件。GNU Arm 嵌入式工具链适用于 32 位 Arm Cortex-A、
Arm Cortex-M 和 Arm Cortex-R 处理器系列。GNU Arm 嵌入式工具链包括 GNU 编译器 (GCC),可直接从 Arm 免费获得,用于在 Windows、Linux 和 Mac OS X 操作系统上进行嵌入式软件开发。
二、gcc-arm-none-eabi安装
Ubuntu 16.04 之后的软件源是自带 gcc-arm-none-eabi 的,只是自动安装后的版本不一定符合要求。常用的安装方式有以下三种:
2.1 自动安装
提示:网络环境比较差的情况下,不推荐自动安装(安装时间以小时为单位)。
(1)在 Ubuntu 用户目录下打开终端,输入命令;
使用 Ubuntu 自带的 APT 下载工具安装 gcc-arm-none-eabi。
sudo apt-get install gcc-arm-none-eabi
(2)Ubuntu 16.04
系统没有安装 gcc 交叉编译器前,我们获取 gcc 版本,提示软件未安装。输入安装命令和密码等待安装完成。
安装完成后,再输入命令获取版本号,可以在最后一行看到版本号。
arm-none-eabi-gcc -v
(3) Ubuntu 18.04
系统没有安装 gcc 交叉编译器前,我们获取 gcc 版本,提示软件未安装。输入安装命令和密码等待安装完成。
安装完成后,再输入命令获取版本号,可以在最后一行看到版本号。
在不添加其它 PPA 的情况下,Ubuntu16.04 和 Ubuntu18.04 都可以自动安装,只是默认版本号高低不同。Ubuntu16.04下 gcc 版本号:gcc version 4.9.3 20150529;Ubuntu18.04下 gcc 版本号:gcc version 6.3.1 20170620。
2.2 添加新的PPA进行安装
提示:网络环境比较差的情况下,不推荐 PPA 安装(安装时间以小时为单位)。
(1)在 Ubuntu 用户目录下打开终端,输入命令,添加替代 PPA;
sudo add-apt-repository ppa:team-gcc-arm-embedded/ppa
(2)更新 PPA;
sudo apt-get update
(3) 安装工具链;
sudo apt-get install gcc-arm-embedded
(4)如果需要移除已安装的工具链;(非需不执行)
sudo apt-get remove gnu-arm-embedded
(5)如果要更新工具链,只要重复(2)、(3)步骤即可;(非需不执行)
(6)如果 gcc-arm-none-eabi 报告冲突的错误消息,这可能是从 4.x 升级到 5+,输入命令卸载旧版本;(非需不执行)
sudo apt-get remove gcc-arm-none-eabi
(7)再输入命令,安装交叉编译器;
sudo apt-get install gcc-arm-none-eabi
如果仍有问题, 参考官方网站,有详细的教程:https://launchpad.net/~team-gcc-arm-embedded/+archive/ubuntu/ppa
2.3 手动安装(推荐)
2.3.1 软件下载
(1)官网下载:https://developer.arm.com/downloads/-/gnu-rm
这里选择了 6-2017-q2-update,可以根据自己的需要下载其它版本。
(2)BaiDuYun:https://pan.baidu.com/s/1d_vAb5g4FPtLBt1El2nVlQ 提取码:j2wk
2.3.2 安装步骤
进入软件包下载目录,打开终端,输入命令;
(1)改变当前目录到指定目录,并保存当前的目录在堆栈顶端;
(1) pushd .
(2)解压下载的软件包(等待解压完成,生成新的文件夹,用 ls 命令可以查看);
(2) tar -jxf gcc-arm-none-eabi-6-2017-q2-update-linux.tar.bz2
(3)将解压出来的软件包(gcc-arm-none-eabi-6-2017-q2-update)移动到 Ubuntu 根目录下的 opt 文件夹中;
(3) sudo mv gcc-arm-none-eabi-6-2017-q2-update /opt
(4)添加环境变量到用户目录下的 .profile 文件(该文件是隐藏文件,在用户目录界面中通过 Ctrl + h 快捷方式可以显示隐藏文件);
(4) exportline="export PATH=/opt/gcc-arm-none-eabi-6-2017-q2-update/bin:\$PATH"
(5)检测环境变量是否添加成功;
(5) if grep -Fxq "$exportline" ~/.profile; then echo nothing to do ; else echo $exportline >> ~/.profile; fi
添加成功不会有输出;如果添加失败,会输出提示。
(6)使能环境变量;
(6) source ~/.profile
(7)改变当前目录,跳转到堆栈顶端保存的目录,并将堆栈顶端的目录删除;
(7) popd
注意:如果安装其他版本的 gcc 编译器,在命令(2)、(3)、(4)中,要把压缩包名和解压的文件名做相应替换。
(8)检查交叉编译器是否安装成功,输入以下命令;
(8) arm-none-eabi-gcc -v
输入命令后,最后一行打印了我们刚才安装的交叉编译器的版本信息,表示安装成功。
三、gcc-arm-none-eabi移除
3.1 自动安装的卸载
(1)用户目录下打开终端,输入卸载命令;
sudo apt-get remove gcc-arm-none-eabi
卸载完成后,再获取版本号,已经被卸载,找不到文件。
3.2 手动安装的移除
(1)用户目录下打开终端,输入移除命令;
sudo rm -rf /opt/gcc-arm-none-eabi-6-2017-q2-update/
(2)打开环境变量文件 .profile,删除或屏蔽编译器安装路径;
sudo gedit .profile
快捷键 Ctrl + s 保存 .profile 文件,点击“X”退出文件。
(3)输入命令使能环境变量;
source ~/.profile
(4)再输入命令,查询版本号;
如果 .profile 文件中,没有手动安装的 gcc 编译器路径,那么 gcc 编译器版本切换回自动安装的版本(前提:没有卸载自动安装的 gcc 编译器)。
四、gcc-arm-none-eabi版本切换
4.1 切换原理简介
有时我们会遇到:不同项目工程所需的 gcc-arm-none-eabi 版本也不同。如何快速有效的切换 gcc 交叉编译器的版本呢?
通过上面的手动安装步骤,我们知道 gcc 交叉编译器最终是否有效,取决于环境变量文件 .profile 中的安装包路径是否被 Ubuntu 系统“知晓”。所以我们使用不同的环境变量,等价于使用不同版本的交叉编译器。
4.2 切换步骤
前提:Ubuntu 系统中,已经安装了2个以上不同版本的 gcc-arm-none-eabi。
(1)用户目录下打开终端,输入命令,查看当前 gcc 编译器版本;
arm-none-eabi-gcc -v
(2)输入命令打开环境变量文件 .profile;
sudo gedit .profile
(3)将不需要的版本环境变量屏蔽,留下需要的版本环境变量即可;
方法:在需要屏蔽的版本路径前加“#”号字符即可。
这里我们保留 5_4 版本,屏蔽 6-2017-q2 版本。快捷键 Ctrl + s 保存 .profile 文件,点击“X”退出文件。
(4)输入命令使能环境变量;
source ~/.profile
(5)此时再输入版本查看命令,可以看到版本切换成功;
(6)如果版本切换失败,可尝试重启 Ubuntu;
reboot
(7)如果 Ubuntu 系统中有自动安装的 gcc 交叉编译器,那么在 .profile 文件中,使能手动安装的 gcc 编译器路径,优先级高于自动安装的编译器版本。
所以在自动安装和手动安装混合的 Ubuntu 系统中,当需要自动安装的 gcc 编译器版本时,屏蔽 .profile 文件中所有手动安装的编译器路径,再重启系统即可;当需要手动安装的 gcc 编译器版本时,使能 .profile 文件中所需手动安装的编译器路径即可。
总结
以上就是在 Ubuntu 系统中 gcc-arm-none-eabi 交叉编译器的三种安装方法介绍,这里主要推荐使用第三种安装方法:手动安装,方便后续版本管理和版本切换。
还讲解了在 Ubuntu 系统中,如何移除 gcc 交叉编译器(自动安装和手动安装 )、如何方便快捷的切换 gcc 交叉编译器的版本。