添加编译宏_C语言的编译过程

灰太狼 2023-01-07 05:57 260阅读 0赞

6d38dae6a64e62ec3fb7e2eaea4f2de2.png

1. 主要步骤

( test.c main.c ) —1—> (test.i main.i) —2—> (test.s main.s) —3—> (test.o main.o) —4—> (a.out)

1 预处理,展开头文件/宏替换/全掉注释/条件编译

2 编译,检查语法,生成汇编

3 汇编,汇编代码转换成机器码

4 链接,链接到一起生成可执行文件

2.编译流程

17658d070dadb1419f27f066e6275ff4.png

3.预处理

C语言中”#“作用是作为预处理命令,在编译器进行编译之前对源码做某些转换.

# 本身为预处理指令,必须是该行除了任何空白字符外的第一个字符。#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符。整行语句构成了一条预处理指令,该指令将在编译器进行编译之前对源代码做某些转换。格式一般为#include <头文件名.h>。

库文件使用#include<***.h>

自定义头文件使用#include”***.h”

4f143d6d892ddac83fbeec01d00ec89e.png

(1)将所有的#define删除,并且展开所有的宏定义。说白了就是字符替换

(2)处理所有的条件编译指令,#ifdef #ifndef #endif等,就是带#的那些

(3)处理#include,将#include指向的文件插入到该行处

(4)删除所有注释

(5)添加行号和文件标示,这样的在调试和编译出错的时候才知道是是哪个文件的哪一行

(6)保留#pragma编译器指令,因为编译器需要使用它们。

#include本质上只是内容替换,那在一个源码中调用另一个源码的函数时能否直接写‘’#include“test.c”’,将test.c的内容复制到当前源码中编译呢?直接编译会发现报错,原因是在一个项目里出现两个一样的函数(当前源码和test.c)。

4.编译

检查C语言的语法,然后生成汇编代码

5.汇编

将汇编代码转换成机器码

6.链接

我们写的代码中有部分的函数的具体执行步骤,即函数对应的机器码在我们的源码里是没有的。单纯只是将我们的源码编译成机器码无法完整的执行所有功能,需要于库文件或者其他源码进行连接才能生成一个完整的可执行文件。

静态链接是由链接器在链接时将库的内容加入到可执行程序中的做法。链接器是一个独立程序,将一个或多个库或目标文件(先前由编译器或汇编器生成)链接到一块生成可执行程序。静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分。

动态链接所调用的函数代码并没有被拷贝到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信息(往往是一些重定位信息)。仅当应用程序被装入内存开始运行时,在Windows的管理下,才在应用程序与相应的DLL之间建立链接关系。当要执行所调用DLL中的函数时,根据链接产生的重定位信息,Windows才转去执行DLL中相应的函数代码。

微信公众号:告别小白

发表评论

表情:
评论列表 (有 0 条评论,260人围观)

还没有评论,来说两句吧...

相关阅读

    相关 C语言编译过程详解

    [C语言编译过程详解][C] 前言 C语言程序从源代码到二进制行程序都经历了那些过程?本文以Linux下C语言的编译过程为例,讲解C语言程序的编译过程。 编写he

    相关 c语言编译过程(转)

    认识C编译执行过程,是C学习的开端。 简单说C语言从编码编译到执行要经历一下过程:   C源代码 编译---->形成目标代码,目标代码是在目标机器上运行的代码。 连接

    相关 c语言编译过程

    c语言的开发是首先写出所有的源代码,然后编译成为可执行代码,然后才可以被cpu执行。 c语言的源代码在编译器看来只不过是一堆字符串而已,在我们看来或许可以看得懂,但

    相关 C语言编译过程

    编译的概念:编译程序读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件格式的要求链

    相关 C语言编译过程浅析

    前几天看了《程序员的自我修养——链接、装载与库》中的第二章“编译和链接”,主要根据其中的内容简单总结一下C程序编译的过程吧。 我现在一般都是用gcc,所以自然以GCC编译

    相关 C语言编译过程

    C语言编译全过程介绍 C语言的编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接。编译就是把文本形式源

    相关 C语言编译过程

      1.预处理    此阶段主要完成\符号后面的各项内容到源文件的替换,往往一些莫名其妙的错误都是出现在头文件中的,要在工程中注意积累一些错误知识。    (1)、\if