跳至主要內容

02.C 编译过程

约 647 字大约 2 分钟

重要提示: 熟悉每个编译过程有助于解决奇奇怪怪的问题

比如: 可以查看预处理结果文件,最终要编译的代码是什么

gcc ***.c


1.预处理
    译过程的第一步预就是预处理,与处理结束后会产生一个后缀为(.i)的临时文件,这一步由预处理器完成。预处理器主要完成以下任务。
        删除所有的注释
        宏扩展
        文件包含

    g++ -E text.cpp -o text.i
    

2.编译
    C 中的编译阶段使用内置编译器软件将 (.i) 
    临时文件转换为具有汇编级指令(低级代码)的汇编文件 (.s)。
    汇编代码是一种简单的英文语言,用于编写低级指令(在微控制器程序中,我们使用汇编语言)。
    整个程序代码由编译器软件一次性解析(语法分析),并通过终端窗口告诉我们源代码中存在的任何语法错误或警告。
    
    g++ -S text.i -o text.s
    
3.汇编
    使用汇编程序将程序集级代码(.s 文件)转换为机器可理解的代码(二进制/十六进制形式)。
    汇编程序是一个预先编写的程序,它将汇编代码转换为机器代码。
    它从汇编文件中获取基本指令,并将其转换为特定于计算机类型(称为目标代码)的二进制/十六进制代码。
    
    g++ -c text.s -o text.o
    
4.连接 
    链接是将库文件包含在我们的程序中的过程。
    库文件是一些预定义的文件,其中包含机器语言中的函数定义,这些文件的扩展名为.lib。
    链接过程会生成一个可执行文件,其扩展名为 .exe 在Linux 操作系统中为 .out
    
    g++ text.o -o mybin
    
    ld.exe 连接器

gcc 常用参数

编译和输出 
-c	仅编译,不链接,生成 .o 目标文件
-o <file>	指定输出文件名称
-S	生成汇编代码(.s 文件)
-E	仅进行预处理,不编译
-v	显示详细的编译过程


优化
-O0	不优化,默认
-O1	基本优化
-O2	普通优化,提高执行速度
-O3	高级优化,包含 -O2 并进行额外优化
-Os	优化代码大小,适合嵌入式系统
-Ofast	极端优化,可能不符合标准
-march=<arch>	针对特定 CPU 进行优化(如 -march=armv7-a)
-mtune=<arch>	优化代码运行(但仍可在其他 CPU 上运行)