C语言中编译器工作的过程

C语言编译的过程

(首先你的系统安装好gcc/g++编译器,这里我就默认都安装好了)
gcc执行的步骤:

  1. 预处理(Pre-Processing): 对 C 语言进行预处理,生成 test.i 文件
  2. 编译(Compiling):将上一步生成的 test.i 文件编译生成汇编语言文件,后缀名为 test.s
  3. 汇编(Assembling):将汇编语言文件 test.s 经过汇编,生成目标文件,后缀名为 test.o
  4. 链接(Linking):将各个模块的 test.o 文件链接起来,生成最终的可执行文件
具体步骤:
  1. 预处理(Pre-Processing)
    首先定义一个C语言框架:
#include <stdio.h>

int main(void)
{
	int a = 1;
	printf("a = %d\n", a);

	return 0;
}

使用**gcc / g++**命令g++ -E hello.c -o hello.i:生成一个hello.i文件

# 1 "hello.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "hello.c"
# 1 "c:\\mingw\\include\\stdio.h" 1 3
# 38 "c:\\mingw\\include\\stdio.h" 3
       
# 39 "c:\\mingw\\include\\stdio.h" 3
# 55 "c:\\mingw\\include\\stdio.h" 3
# 1 "c:\\mingw\\include\\_mingw.h" 1 3
# 55 "c:\\mingw\\include\\_mingw.h" 3
       
# 56 "c:\\mingw\\include\\_mingw.h" 3
# 66 "c:\\mingw\\include\\_mingw.h" 3
# 1 "c:\\mingw\\include\\msvcrtver.h" 1 3
# 35 "c:\\mingw\\include\\msvcrtver.h" 3
       
# 36 "c:\\mingw\\include\\msvcrtver.h" 3
# 67 "c:\\mingw\\include\\_mingw.h" 2 3
.

//下面还有很多......
  1. 编译(Compiling)
    使用**gcc / g++**命令g++ -S hello.i -o hello.s:生成一个hello.s文件
	.file	"hello.c"
	.text
	.def	___main;	.scl	2;	.type	32;	.endef
	.section .rdata,"dr"
LC0:
	.ascii "a = %d\12\0"
	.text
	.globl	_main
	.def	_main;	.scl	2;	.type	32;	.endef
_main:
LFB15:
	.cfi_startproc
	pushl	%ebp
	.cfi_def_cfa_offset 8
	.cfi_offset 5, -8
	movl	%esp, %ebp
	.cfi_def_cfa_register 5
	andl	$-16, %esp
	subl	$32, %esp
	call	___main
	movl	$1, 28(%esp)
	movl	28(%esp), %eax
	movl	%eax, 4(%esp)
	movl	$LC0, (%esp)
	call	_printf
	movl	$0, %eax
	leave
	.cfi_restore 5
	.cfi_def_cfa 4, 4
	ret
	.cfi_endproc
LFE15:
	.ident	"GCC: (MinGW.org GCC-8.2.0-5) 8.2.0"
	.def	_printf;	.scl	2;	.type	32;	.endef

  1. 汇编(Assembling)
    使用**gcc / g++**命令g++ -c hello.s -o hello.o:生成一个hello.o文件

此处产生的hello.o的文件为一个二进制文件,所以这里我使用UltraEdit
(这里可以下载)打开,如果你的使用Linux系统,可以使用xxd hello.o查看

在这里插入图片描述

  1. 链接(Linking)
    这里一步,编译器会将所有的.o的文件链接起来使用使用**gcc / g++**命令g++ hello.o -o hello:生成一个可执行文件hello.exe

到此就是整个编译器实现编译链接的过程啦

好了,今天的分享就到这里了☺ヾ(◍°∇°◍)ノ゙

小白快乐学C,每天进步一点点,有什么有趣的记得分享哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值