C语言编译的过程
(首先你的系统安装好gcc/g++编译器,这里我就默认都安装好了)
gcc执行的步骤:
- 预处理(Pre-Processing): 对 C 语言进行预处理,生成 test.i 文件
- 编译(Compiling):将上一步生成的 test.i 文件编译生成汇编语言文件,后缀名为 test.s
- 汇编(Assembling):将汇编语言文件 test.s 经过汇编,生成目标文件,后缀名为 test.o
- 链接(Linking):将各个模块的 test.o 文件链接起来,生成最终的可执行文件
具体步骤:
- 预处理(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
.
//下面还有很多......
- 编译(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
- 汇编(Assembling):
使用**gcc / g++**命令g++ -c hello.s -o hello.o
:生成一个hello.o
文件
此处产生的hello.o的文件为一个二进制文件,所以这里我使用UltraEdit
(这里可以下载)打开,如果你的使用Linux系统,可以使用xxd hello.o
查看
- 链接(Linking):
这里一步,编译器会将所有的.o
的文件链接起来使用使用**gcc / g++**命令g++ hello.o -o hello
:生成一个可执行文件hello.exe
到此就是整个编译器实现编译链接的过程啦
好了,今天的分享就到这里了☺ヾ(◍°∇°◍)ノ゙
小白快乐学C,每天进步一点点,有什么有趣的记得分享哦!