一、编译器

1、什么是编译器

  • 编译器是一种计算机程序,它的主要功能是将用一种编程语言(如C、C++、Java、Python等)编写的源代码转换成目标机器的机器语言(也称为机器码或二进制代码),这样计算机就可以直接执行这些代码了。

高级语言(程序员容易编辑的)--->低级语言(机器运行的)

2、编译器的分类

根据不同的应用场景和实现方法,编译器可以分为多种类型。

按照所处理的语言类型来分,编译器可以分为C++编译器、Java编译器等;

按照所处理的目标平台来分,编译器可以分为x86编译器、ARM编译器等;

按照所采用的编译原理来分,编译器可以分为前端编译器、中间编译器和后端编译器等。

3、常用的编译器

3.1、GCC

GCC最开始的原名是GNU C Compiler,是GNU项目的C语言编译器。后来逐步拓展支持了更多的语言,支持编译C、C++、Fortran、Pascal、Objective-C、Java、Ada、Go等,所以变成了GNU Compiler Collection(GNU编译器套装),是一套由GNU项目开发的支持多种编程语言的编译器工具链。

GCC支持多种平台和操作系统,包括Linux、Windows、macOS等,并且是许多开源项目和操作系统的标准编译器,如Linux内核。GCC还支持多种CPU指令集架构,如:X86、ARM等。

在Windows系统上,GCC的移植版本中较为知名的是MinGW和TDM-GCC。

GCC 各部分组件

详细可参考:GCC的组成部分以及使用到的软件 - C语言中文网icon-default.png?t=O83Ahttps://c.biancheng.net/view/679.html

3.2、MSVC

MSVC(Microsoft Visual C++)由微软开发,主要用于Windows平台应用程序的开发;

Visual Studio系列IDE默认集成了该编译器,可以通过下载安装Visual Studio安装包来安装;

MSVC只能在Windows下用,不支持跨平台。

在Windows下,与开发环境以及code编辑器协同更好的还是MSVC(Microsoft Visual C/C++)编译器。对于灵活程度更高的code编辑器,我们可以将Microsoft的Visual C/C++编译器下载并集成到code中。

MSVC编译器工具链主要由cl.exe与link.exe构成。其中:

  • cl.exe用于控制在 Microsoft C/C++的编译器和链接器
  • link.exe 将通用对象文件格式 (COFF) 对象文件和库链接起来,以创建可执行 (.exe) 文件或动态链接库 (DLL)
  • 用户只需要调用cl.exe,即可完成编译-链接全过程。
  • Microsoft官方介绍:cl.exe的命令行语法

主要工具

3.3、Clang

Clang是一个由 LLVM 项目开发的 C、C++、Objective-C 等编程语言的编译器前端。它旨在提供更快的编译速度、更好的错误报告及与GCC兼容的编译器驱动程序。Clang 是 LLVM 编译器基础设施的一部分,通常与 LLVM 后端一起使用来生成机器代码。

LLVM项目的目标是提供一个GNU编译器套装(gcc)的替代品,由苹果公司的赞助开发,其源代码授权采用的是类BSD的伊利诺伊大学厄巴纳-香槟分校开源码许可。

相比于gcc,clang具有如下优点:

  • 编译速度更快:在某些平台上,clang的编译速度要明显快于gcc。
  • 占用内存更小:clang生成的AST所占用的内存通常是gcc的五分之一左右。
  • 模块化的设计:clang采用基于库的模块化设计,更易于IDE的集成及其他用途的重用。
  • 诊断信息可读性强:在编译过程中,clang会创建并保留大量详细的元数据 (metadata),这将更有利于调试和错误报告。
  • 设计更清晰简单,容易理解,易于扩展加强。与代码基础较为古老的gcc相比,学习曲线会显得更为平缓。

二、GCC编译工具

C语言是不能在计算机上直接运行的(C语言是高级语言、计算机运行的是机器语言)

其中gcc 与 g++ 是GCC 工具集的一部分

gcc 与 g++ 分别是 gnu 的 c & c++ 编译器 gcc/g++ 在执行编译工作的4步:

  • 1、预处理,生成 .i 的文件[预处理器cpp]
  • 2、将预处理后的文件转换成汇编语言, 生成文件 .s [编译器egcs]
  • 3、有汇编变为目标代码(机器代码)生成 .o 的文件[汇编器as]
  • 4、连接目标代码, 生成可执行程序 [链接器ld]

一些常用的参数及含义下表所示:

参数名称 含义
-E 仅执行预处理,不进行编译、汇编和链接(生成后缀为 .i 的预编译文件)
-S 执行编译后停止,不进行汇编和链接(生成后缀为 .s 的预编译文件)
-c 编译程序,但不链接成为可执行文件(生成后缀为 .o 的文件)
-o 直接生成可执行文件

--help

查看帮助信息(注意前面是两个“-”,一个“-”不行)
--version 查看版本信息(注意前面是两个“-”,一个“-”不行)
-v 查看gcc编译器的版本,显示gcc执行时的详细过程

更多的可以参考:GCC 参数详解 | 菜鸟教程icon-default.png?t=O83Ahttps://www.runoob.com/w3cnote/gcc-parameter-detail.html

 三、交叉编译工具链

1、为什么要进行交叉编译?

由于开发时需要在主机和目标机之间交替结合进行,所以就有了交叉编译的概念

在软件开发过程中,通常会使用高性能的开发主机来编写、调试和测试代码。然而,最终的目标可能是在低功耗设备或嵌入式系统上运行代码。

那么,开发用的主机环境和目标机环境会完全一样吗?那还分啥主机和目标机了就是本机用的编译器编译;那么主机和目标机平台不一样呢?

注:交叉编译就是在一个平台上生成可以在另一个平台上执行的代码。因此,不同的CPU需要有相应的编译器,而交叉编译就如同翻译一样,把相同的程序代码翻译称不同的CPU对应语言。要注意的是,编译器本身也是程序,也要在与之对应的某一个CPU平台上运行

2、交叉编译工具链命名总则

一般来说,交叉编译工具链的命名规则为:arch-core-kernel-system-language。其中:

  • arch:体系架构,如ARM,MIPS,等,表示该编译器用于哪个目标平台;
  • core:使用的是哪个CPU Core,如Cortex A8;或者是指定工具链的供应商。如果没有特殊指定,则留空不填。这一组命名比较灵活,在某些厂家提供的交叉编译链中,有以厂家名称命名的,也有以开发板命名的,或者直接是none或cross的;
  • kernel: 所运行的OS,见过的有Linux,uclinux,bare(无OS);
  • system:交叉编译链所选择的库函数和目标映像的规范,如gnu,gnueabi等。其中gnu等价于glibc+oabi;gnueabi等价于glibc+eabi。若不指定,则也可以留空不填;
  • language:编译语言,表示该编译器用于编译何种语言,最常见的就是gcc,g++;

注意:这个规则属于一个普遍遵循的命名约定,并没有在哪份官方资料上看到过也会有个别的命名不一样的

3、安装交叉编译工具链

Windows中装软件的特点

Windows中装软件使用安装包,安装包解压后有2种情况:

  • 一种是一个安装文件(.exe .msi),双击进行安装,下一步直到安装完毕。安装完毕后会在桌面上生成快捷方式,我们平时使用快捷方式来启动这些程序;
  • 另一种是所谓的绿色软件、免安装软件。这种不用安装,直接解压开里面就有exe可以直接双击执行。

linux中装软件的特点

linux中安装软件比windows中复杂。linux中安装软件一般有以下几种方法:

  • 第一种:在线安装。譬如ubuntu中使用apt-get install vim来安装vim软件。
  • 第二种:自己下载安装包来安装。这种方式的缺陷就是你不知道你下载的安装包和你的系统是否匹配。
  • 第三种:最装逼的一种方式,就是源代码安装。

交叉编译工具链的选择

我们选择交叉编译工具链的原则:和我们所使用的目标平台(给哪款SoC编程)尽量去匹配。

开发时自行查看对应文档就好

通常我们采用的是第二种方式安装:

自己在网站上找到对应的安装包,或者客服给的资料里的安装包

参考示例(海思3559的,)

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐