我的全栈之路-C语言基础之C程序运行流程
我的全栈之路4.1 C程序的运行流程
C语言编写的程序一般都要经过编写源文件->预处理->编译->汇编->链接后运行这几个流程。
- 预处理
预处理主要是宏替换、包含头文件、条件编译以及删除注释等操作,预编译阶段生成文件的后缀名通常是.i。 - 编译
编译主要是将预处理好的文件生成汇编文件,编译后文件的后缀名通常是.s。 - 汇编
汇编主要是将汇编文件生成二进制文件,汇编后的文件的后缀名通常是.o。 - 链接
链接主要是将各个二进制文件、库函数、启动代码生成可执行文件。
接下来编写源程序program_running_process.c,然后结合Windows上的GCC编译器提供的各个选项实现预处理、编译、汇编、链接,关于GCC的安装和配置可以参考
Visual Studio Code实现Hello World章节的内容。
#include <stdio.h>
//定义浮点型的常量
#define PI 3.14
/*
C语言程序的运行流程
@author tony ittimelinedotnet@gmail.com
@version 2019/08/20
*/
int main(int argc, char* argv[]) {
printf("PI =%lf\n", PI);
return 0;
}
预处理使用 gcc -E 选项即可实现,其中-o表示输出文件的名称
D:\workspace\c\visualstuido2019\c-core-programming\c-core-programming-foundational\c-core-programming-foundational>gcc -E program_runing_process.c -o program_runing_process.i
预处理完成以后,生成的文件program_running_process.i的大小是54kb
当预处理完成以后,定义的常量被替换成实际的值,而#include包含的头文件内容也被复制到预处理的生成的文件中
编译通过gcc -S 选项实现
D:\workspace\c\visualstuido2019\c-core-programming\c-core-programming-foundational\c-core-programming-foundational>gcc -S program_runing_process.i -o program_runing_process.s
编译会生成汇编文件
.file "program_runing_process.c"
.text
.def __main; .scl 2; .type 32; .endef
.section .rdata,"dr"
.LC1:
.ascii "PI =%lf\12\0"
.text
.globl main
.def main; .scl 2; .type 32; .endef
.seh_proc main
main:
pushq %rbp
.seh_pushreg %rbp
movq %rsp, %rbp
.seh_setframe %rbp, 0
subq $32, %rsp
.seh_stackalloc 32
.seh_endprologue
movl %ecx, 16(%rbp)
movq %rdx, 24(%rbp)
call __main
movq .LC0(%rip), %rax
movq %rax, %rdx
movq %rdx, %xmm1
movq %rax, %rdx
leaq .LC1(%rip), %rcx
call printf
movl $0, %eax
addq $32, %rsp
popq %rbp
ret
.seh_endproc
.section .rdata,"dr"
.align 8
.LC0:
.long 1374389535
.long 1074339512
.ident "GCC: (x86_64-posix-seh-rev0, Built by MinGW-W64 project) 7.3.0"
.def printf; .scl 2; .type 32; .endef
汇编通过gcc -c 选项实现
D:\workspace\c\visualstuido2019\c-core-programming\c-core-programming-foundational\c-core-programming-foundational>gcc -c program_runing_process.s -o program_runing_process.o
链接gcc没有提供选项,这里只要执行gcc program_running_process.o -o program_running_process.exe就会链接生成可执行文件
D:\workspace\c\visualstuido2019\c-core-programming\c-core-programming-foundational\c-core-programming-foundational>gcc program_runing_process.o -o program_runing_process.exe
windows下的可执行文件后缀名默认是.exe,当然gcc编译器不关心后缀名,如果你的ubuntu或者macOS下安装了gcc,也可以将C程序编译生成.exe后缀的可执行文件。