今天我们来讲讲一个c语言的源程序是怎么样最终编译成单片机所能执行的程序的
通过前面的学习我们也可以知道,c语言这种编程语言,是不被单片机所认识的,对于单片机,他们只能识别机器语言0和1。
所以在当我们写好一个c语言源程序之后,我们接下来非常重要的一步就是对程序进行编译链接,最终生成可以在单片机运行的程序。
总得来说一个.c源文件需要经过四步才能生成单片机所需要的二进制文件可执行文件:
第一步:预处理预处理,顾名思义就是在编译之前,我们先对.c结尾的c源文件进行处理,这个过程主要是将以#号开头的指令进行处理,预处理命令都有如下这些:
在这里我们举个例子:
比如在我们代码的开头 #include<stdio.h> 这句代码,是包含stdio.h这个头文件,在预处理阶段它将会被处理
前面我们说过写了#include<stdio.h>相当于是代替了stdio.h里的所有代码,是因为在预处理阶段,这句代码将会被stdio.h文件里的所有内容替代。
你可以理解为我们给stdio.h来了一个全选,然后复制,然后粘贴覆盖掉原先我们的那句#include<stdio.h>,就这么简单,这个是预处理会处理的过程。
当然我这里只是举例了#include会怎么处理,还有很多以#号开头的指令,后续我会专门出一个章节给大家说说都有哪些,又是怎么用的,关注我,让学习之路不枯燥不孤单[呲牙]
注意:这个预处理的过程.c文件预处理完之后,出来是.i文件,.i和.c文件一样,都是文本文件,你打开之后,能看的了里面内容。
第二步:编译编译的过程是将.i结尾文件变成.s的汇编语言文件,汇编语言是更加贴近底层的语言。
注意:相比之下会比c语言的可读性差,在这个阶段,你一样可以通过记事本之类的,打开生成的.s汇编文件,因为.s文件依旧是文本文件。
第三步:汇编汇编的过程,是将.s的汇编文件变为.o为后缀的二进制文件,为机器码
第四步:链接链接过程是将库文件链接起来,生成可执行目标文件,在这个过程你可以理解为将多个.o文件整合在一块,成一个可执行的二进制文件。
举个例子:比如我们的前面学过的最简单的程序,假设在hello.c中:
#include <stdio.h>
void main()
{
//我的第一个C语言程序
printf("hello小钱嵌入式\n");
}
在这个代码里,printf的声明是在stdio.h,但是这个函数具体实现是在printf.o里面
链接的过程就是将其与我们hello.o的程序进行合并,最终得到hello文件,是一个可执行的目标文件,可以被加载到内存,由系统执行。
在这里hello文件是二进制文件了,如果我们通过记事本或者notepad等工具打开,将会看到一堆的乱码,因为它不是文本文件。
总结:c语言源文件的编译过程:
- 预处理: .c —>.i
- 编译: .i —>.s
- 汇编:.s—>.o
- 链接:多个.o—>可执行二进制程序
觉得有帮助的可以点赞+收藏起来,后面慢慢看哦~[耶]
我是小钱嵌入式,会不断的和大家分享嵌入式相关的内容,如果你觉得我的分享对你有些帮助,请不要吝惜你的点赞和关注[祈祷],原创写作不易,兄弟姐妹们的点赞和关注[呲牙],就是我分享最大的动力,谢谢[祈祷],欢迎在评论区和我一起讨论[灵光一闪]。