编译⼯具链和交叉编译⼯具链简易说明
⽂章⽬录
编译⼯具链
做C/C++开发特别是嵌⼊式⽅向的肯定会涉及编译⼯具链和交叉编译⼯具链相关内容。
C/C++的程序需要经过 gcc 等编译成⼆进制程序才能被计算机使⽤,这⾥的 gcc 通常是泛指,包括 gcc 、 g++ 、ar 、as 、ld 等⼀系列⼯具,这些⼯具⽤在程序⽂件的预编译、编译、链接等整个过程中,这整⼀套⼯具就被称为 编译⼯具链(Toolchain)。
通常我们说gcc、g++是具体某⼀个功能的⼯具,事实上通常它完整的名称都⽐较长:
上图是两个不同的编译⼯具链,可以看到两者最⼤的区别就是⽂件名前⾯部分的字段,这部分字段通常会遵循⼀定的规则 —— arch[-vendor] [-os][-abi] ,这⾥的各个字段都是针对 ⽬标平台 ⽽⾔的(就是编译⽣成的程序最终运⾏的平台),各字段说明如下:
arch ⽬标CPU架构
⽬标cpu架构⽐如aarch64、arm、x86、riscv等,这个字段通常不会省略;
vendor 提供此编译⼯具链的⼚商名称或是⼚商特定信息
这个字段只是标识信息,没有实际意义,可以为 none 、 unknow 或是直接省略;
os ⽬标设备上运⾏的操作系统
这个字段常见的就 linux 和 none 两个, none 基本都是⽤于裸机程序的, linux 指编译出的程序是运⾏在 linux 上的,可以使⽤系统线程进程等函数;
abi 应⽤程序⼆进制接⼝(Application Binary Interface)
这个字段常见的值就⽐较多了,⽐如 abi 、 eabi 、 gun 、 gnueabi 、 gnueabihf 、 uclibc、 uclibcgnueabi 等;
eabi 指嵌⼊式应⽤程序⼆进制接⼝((Embedded Application Binary Interface));
gun指使⽤的库为 glibc , uclibc 使⽤的库为 uclibc ;
hf 指默认编译参数⽀持硬件浮点功能;
交叉编译⼯具链
前⾯介绍了编译⼯具链的命名规则中主要体现了 ⽬标平台 的⼀些信息,另外也介绍了编译⼯具链就是⼀系列的软件集合。这⾥就牵扯出另⼀个问题了,我们知道 windows 上的程序只能在 windows 上运⾏,macos 上的程序只能在 macos 上运⾏,linux 上的程序只能在
linux 上运⾏。所以就算是同⼀⽬标平台的编译⼯具链也可能分为运⾏在 windows 上的版本、运⾏在 macos 上的版本或是运⾏在 linux 上的版本等等。很多时候编译⼯具链的 运⾏平台 和 ⽬标平台 是不⼀样的,所以就有 交叉编译⼯具链(Cross Toolchain) 这⼀说法了。
交叉编译⼯具链可以使⽤ crosstool-ng 这类⼯具⾃⼰编译⽣成,不过更常见的直接使⽤现成的。通常芯⽚或是开发板⼚家都会提供交叉编译⼯具链或是整合了交叉编译⼯具链的SDK等。此外还有很多提供通⽤交叉编译⼯具链的机构或组织,可以从这些地⽅下载。这些下载的交叉编译⼯具链⽂件命名通常包含 ⽬标平台 和 运⾏平台 信息,⽬标平台信息格式基本遵循前⾯描述,运⾏平台信息格式就⽐较随意了,下⾯将列举⼀些进⾏介绍。
x86架构和arm架构区别
下⾯是这个站点提供的⼀些交叉编译⼯具链,后⾯括号中的是我补充的注释:
gcc-linaro-7.5.0-2019.12-i686-mingw32_aarch64-linux-gnu (运⾏在x86和x64架构上的windows系统中)
gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf (运⾏在x86和x64架构上的linux系统中)
gcc-arm-10.3-2021.07-mingw-w64-i686-arm-none-eabi (运⾏在x86和x64架构上的windows系统中)
gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf(运⾏在x86和x64架构上的linux系统中)
gcc-arm-10.3-2021.07-aarch64-arm-none-linux-gnueabihf(运⾏在64位arm架构上的linux系统中)
gcc-arm-none-eabi-10.3-2021.10-win32 (运⾏在x86和x64架构上的windows系统中)
gcc-arm-none-eabi-10.3-2021.10-x86_64-linux(运⾏在x86和x64架构上的linux系统中)
gcc-arm-none-eabi-10.3-2021.10-mac (运⾏在mac系统中)
最后再提下版本号:
通常来说交叉编译⼯具链的版本号和编程语⾔语法版本和库版本有关,越新的交叉编译⼯具链就⽀持越新的语法和库。⾼版本的交叉编译⼯具链通常会兼容低版本的语法规则。⼀般的如果项⽬有指定交叉编译⼯具链的版本就⽤指定的版本,如果没有就选择新⼀些的版本。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。