尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

一文搞懂GCC、MinGW、MSVC、LLVM、Clang、AC5、AC6有啥区别

一文搞懂GCC、MinGW、MSVC、LLVM、Clang、AC5、AC6有啥区别 提问我们在学习编程的时候都会写一句printf(hello world!)但是这句代码在不同平台会被编译成不同的可执行程序例如当我们最早在windows上学习c语言时程序会被编译成mian.exe双击即可运行。后来我们学习了Linux编译后的可执行文件没有后缀名直接在目录下执行./mian即可运行。再后来我们学习了单片机编译后形成了一个mian.hex文件通过调试器烧录到板子里面就可以运行了。对于相同的代码生成格式不一样的可执行文件他们使用的编译器是相同的吗C语言编译的过程不论在什么设备上c语言从代码到可执行文件都要执行4个步骤预处理执行展开头文件、宏替换、删除注释、条件编译等工作。编译语法解析例如没写分号有红字报错就是这一步弹出来的、翻译为汇编语言。汇编将汇编语言翻译成二进制机器码。链接例如printf其实调用的是windows公司电脑平台或arm公司STM32平台提供的运行库这一步就是将他们提供的printf的机器码拼接进来。这些步骤都是由应用程序实现的而这些程序叫什么名字各个平台是不同的这也是我们在安装编译器时安装的应用程序具体介绍会在下文的不同平台介绍。在Windows下编译C文件我们上大学的时候老师直接让我们安装的是Visual Studio 2010只需要下载这个软件然后无脑下一步安装最后建一个.c文件写上代码最后点上面绿色的编译运行就能直接执行exe程序了那么这其中到底发生了什么呢在安装Visual Studio2010的时候会提示正在安装一些组件这里面要说明的是他帮我们安装了MSVC这里面有cl.exe软件和link.exe软件这两个软件在上述的C语言编译过程中起作用使你点击编译运行就能直接运行你写的程序。所以MSVC (Microsoft Visual C)是微软官方出品的编译器随 Visual Studio 安装它是 Windows 平台的“亲儿子”。在Linux下编译C文件后来的课程涉及到了Linux当时是直接装了一个Ubuntu的虚拟机第一节课的时候老师直接让我们用vim写了一个c代码。然后使用gcc mian.c -o main来编译代码。这里没办法使用点个按钮的方法编译所以使用了一句命令。在安装Ubuntu的时候他自动帮我们安装了GCC编译器所以我们可以直接使用gcc命令编译这里面包含了gcc软件和ld软件这两个软件在上述的C语言编译过程中起作用使你运行上面的命令就可以生成程序。所以GCC是Linux 世界的里官方的用的最多的编译器。再次回到在Windows下编译C文件如果我不想用Visual Studio 2010开发C语言程序而是像在Linux下使用记事本写代码然后在终端里面输入指令编译有办法吗有的兄弟有的还记得前面Linux下用的GCC吗他有Windows版本叫MinGW这下你就知道了原来可以使用mingw mian.c -o mian的方式来编译代码吗因为MinGW是Windows版的GCC所以命令还是用的gcc mian.c -o main。但是MSVC会在安装Visual Studio 的时候自动帮我们安装GCC会在安装Ubuntu的时候自动帮我们安装。MinGW没有人帮我们自动安装所以当你想在Windows上用MinGW的时候你得自己去安装一下。在苹果电脑上编译C文件由于我没有苹果电脑没有实际上手操作过。但macOS 也是类 Unix 系统它不用 GCC而是全面使用 Apple 打造的 LLVM/Clang 体系。这里面的软件会在上述的C语言编译过程中起作用生成程序。据说应该也是安装系统的时候会自动帮你安装好的。来到嵌入式领域因为主包学的是物联网专业所以也会遇到要在STM32上编译C文件的情况这里的情况和上面的情况不同。在上面的情况中不论是在Windows、Linux还是苹果他们编译出来的程序都是在自身上运行的但是开发STM32我们往往是在电脑上写代码然后下载到板子上运行所以上述的编译器MSVC、GCC、MinGW、LLVM、Clang都是不适用的我们需要用到针对STM32的编译器这个过程就叫做交叉编译即在电脑上下载适用于STM32的编译器并为STM32编译程序。在Keil5上编译嵌入式C文件上面说了我们需要下载适用于STM32的编译器那我们如何下载呢其实只需要下载Keil5就行了他会默认下载编译器还有一大堆工具全都帮你整好了就会非常的方便。这也是为啥有时候有些老工程使用的是AC5编译器但你下载的是最新版Keil就会导致他默认下载的编译器和你的工程需求的AC5编译器不兼容这时候就需要你自己手动安装一下了我现在安装了好几个在你点击编译的时候AC5或者AC6里面的armclang软件就会在上述的C语言编译过程中起作用生成hex程序。这里的编译器是ARM官方基于Clang改造的应该是闭源的所以只能在Keil里面用。在vscode或clion中编译嵌入式C文件如果你不想用keil觉得他太古老了很难用想改善一下体验可以去尝试一下vscode或clion。但是前面说了AC5、AC6是闭源的那有没有开源的编译器呢有的兄弟有的**GCC-ARM-Embedded (arm-none-eabi-gcc)这是 Linux/Windows 上开发 ARM 单片机最标准的开源交叉编译器负责把 C 代码变成 STM32 芯片看得懂的机器码。**你可以去vscode或clion的插件市场下载到。但是编译只是一小部分还有调试以及配置launch.json文件等还是会比较麻烦所以图方便Keil还是不可替代的至于怎么配置调试和一些配置文件这就又是另一个话题了。拓展那ESP32和AVR平台呢前面说的AC5、AC6、GCC-ARM-Embedded都是不适用的他们主要用于的是STM32平台对于ESP32你得去安装Xtensa / RISC-V GCC对于AVR你得去安装AVR-GCC。当然如果你嫌麻烦的话直接使用Arduino平台开发也是可以的这个平台和keil差不多你在安装软件的时候就可以帮你把编译器还有一大堆工具全都帮你整好了就会非常的方便。扩展还有树莓派这些arm-linux平台这些平台也常出现在嵌入式设备中而且没有像keil这种“一条龙服务”的IDE平台所以在电脑上写代码的时候我们一般是在Windows中装一个Linux虚拟机然后在虚拟机中装适配树莓派平台的编译器aarch64-linux-gnu-gcc一般来说厂家会告诉你怎么下载和安装照着教程弄就行了。那么思考一下我们能不能直接在Windows里面装一个aarch64-linux-gnu-gcc从而省去安装Linux虚拟机这么麻烦的步骤呢当让你也可以直接远程到树莓派本体上去写代码这时候就不存在交叉编译的问题了这时候就和上文说的在Linux下编译C文件是一样的你在烧录树莓派镜像的时候编译器就已经包含在里面了。直接用gcc命令编译就可以了。总结对于程序需要运行的最终平台即目标机即使我们写的是相同的代码也要使用不同的编译器来编译出适配不同平台的可执行程序。这就回答了文章的标题GCC、MinGW、MSVC、LLVM、Clang、AC5、AC6有啥区别他们是为了满足编译不同目标机程序而设计的编译器。
返回列表