c语言编程笔录

首页 >   > 笔记大全

笔记大全

c语言如何编译详细示例

更新时间:2023-12-06

概述

C语言是一种高级语言,需要被编译成机器码才能在计算机上运行。编译过程可以分为四个步骤:预处理、编译、汇编、链接。本文将详细讲解每个步骤的作用,并且提供示例代码。

预处理

预处理阶段是通过预处理器程序将源代码处理成一个中间代码文件,用于后续步骤进行编译。预处理器程序会根据源代码文件中以#开头的指令进行处理,如#include、#define等。最终处理结果将会在编译阶段使用。

示例代码为文件example.c:

#include <stdio.h>

#define PI 3.14

int main() {
    float radius = 3.5;
    float area = PI * radius * radius;
    printf("The area of the circle is %f", area);
    return 0;
}

进行预处理的命令为:

gcc -E example.c -o example.i

预处理结果在文件example.i中,可以通过以下方式查看:

cat example.i

编译

编译阶段是将中间代码文件转化为汇编语言文件,也就是将程序员编写的源代码转化为计算机可以理解的语言。编译器程序会对预处理后的文件进行词法分析、语法分析、代码优化等操作,最终生成目标文件。目标文件包含了二进制机器码和数据,可以直接在计算机上执行。

示例代码为文件example.c:

#include <stdio.h>

#define PI 3.14

int main() {
    float radius = 3.5;
    float area = PI * radius * radius;
    printf("The area of the circle is %f", area);
    return 0;
}

进行编译的命令为:

gcc -S example.c -o example.s

编译结果在文件example.s中,可以通过以下方式查看:

cat example.s

汇编

汇编阶段是将汇编语言代码转化为可执行文件。汇编器程序会将汇编语言代码转化为机器能识别的指令集,生成二进制目标文件。生成的目标文件还不是一个完整的可执行程序,仍需要链接操作。

示例代码为文件example.s:

    .file	"example.c"
    .text
    .section	.rodata
.LC0:
    .string "The area of the circle is %f"
    .text
    .globl	main
    .type	main, @function
main:
    pushq	%rbp
    movq	%rsp, %rbp
    subq	$16, %rsp
    movl	$3, -4(%rbp)
    movss	LCPI1_0(%rip), %xmm0
    movl	$1065353216, %eax
    movq	%xmm0, -16(%rbp)
    cvtps2pd	-16(%rbp), %xmm0
    movl	$.LC0, %edi
    mov	DWORD PTR [rsp+4], 0
    movl	$1, %eax
    call	printf@PLT
    movl	$0, %eax 
    leave
    ret
.LCPI1_0:
    .long	1027405632 
    .ident	"GCC: (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0"
    .section	.note.GNU-stack,"",@progbits

进行汇编的命令为:

gcc -c example.s -o example.o

汇编结果在文件example.o中,可以通过以下方式查看:

od -t x1z example.o

链接

链接阶段是将多个目标文件合并为一个可执行文件,同时还需要将目标文件中引用的函数和库文件链接进来。链接器程序会根据程序员编写的代码,确定函数和数据的位置,生成最终的可执行二进制文件。

示例代码为文件example.o:

gcc example.o -o example

链接结果在文件example中,可以通过以下方式执行:

./example
总结:C语言编译过程可以分为预处理、编译、汇编、链接四个步骤,分别生成中间代码文件、汇编语言代码、目标文件和可执行文件。其中,预处理阶段主要是处理以#开头的指令,编译阶段将代码转化为中间代码,汇编阶段将中间代码转化为机器码,链接阶段将多个目标文件合并为一个可执行文件。掌握C语言编译过程对于全栈程序员来说是必备的基础知识。