C程序的编译过程

从一个.cpp文件到执行需要经历四个过程:
这里写图片描述

以一个实例来说明编译过程,假设现在有一个hello.c文件

1、预处理

gcc -E hello.c -o hello.i
主要内容如下:
(1)将所有的#define删除,并且展开所有的宏定义;
(2)处理所有的条件编译,如#if,#ifdef;
(3)处理#include预编译指令,将被包含的文件插入到该预编译指令的位置。该过程递归进行,及被包含的头文件内还包含其他的文件;
(4)删除所有的注释//和/**/;
(5)添加行号和文件标识,如#1 “hello.c”,以便于编译时编译器产生调试用的行号信息及用于编译时产生编译错误警告能够显示行号信息;
(6)保留所有的#pragma编译器指令,因为编译器需要使用它们。

2、编译

生成汇编代码。
主要内容如下:
(1)语法分析
(2)词法分析
(3)语义分析
(4)符号汇总
gcc -s hello.i -o hello.s

3、汇编

汇编器将汇编代码转换为机器可以执行的命令。
主要内容如下:
(1)形成符号表
(2)汇编转换为二进制指令
gcc -c hello.c -o hello.o

4、链接

生成可执行文件。
主要内容如下:
(1)合并段表
(2)符号表的合并
(3)符号表的重定位
gcc -o hello hello.o

运行的时候,也分为几个步骤:
(1)加载到内存
(2)进入main函数
(3)执行程序代码
(4)结束程序

在linux环境下,程序编译的过程:
这里写图片描述
-E:将.c文件预处理为.i文件
-S:将预处理输出的.i文件汇编成.s文件
-c:将汇编输出的。s文件编译输出.o文件
-o:将.c文件预处理、编译、汇编、链接形成可执行文件。-o选项用来指定输出文件的文件名

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值