• gcc编译C语言


    目录

    一、gcc编译C语言过程

    gcc编译C语言程序的过程分成四个阶段:预处理、编译、汇编和链接。

    在这里插入图片描述

    编译流程命令作用解释
    预处理阶段gcc -E hello.c -o hello.i该过程会对各种预处理指令(以#开头的代码行,如#include,#define,#ifdef等等)进行处理,删除注释和多余的空白字符。E是参数,是通知gcc对hello.c进行预编译; o是参数,是对命令输出结果进行导入操作,这里是将gcc -E hello.c操作结果输出到文件hello.i(这里文件名可以自定义)进行保存
    编译阶段gcc -s hello.i -o hello.s该过程会对代码进行语法、语义分析和错误判断,生成汇编代码文件。S是参数,用于通知gcc对目标文件hello.i进行编译。
    汇编阶段gcc -c hello.s -o hello.o该过程会将汇编代码转化为计算机可识别的二进制文件。对命令的解释:c是参数,用于通知gcc对文件hello.s进行指令转换操作。
    链接阶段gcc hello.o -o hello该过程就是将多个.o文件合并成一个可执行文件(也就是二进制指令),类似windows下的.exe文件。对命令的解释:hello就是我们最后能够直接运行的可执行文件。
    1. 预处理阶段

    在这一阶段,gcc会对源代码进行预处理。预处理器会扫描源代码,并处理以’#'开头的预处理指令,如#include、#define等,将它们转换为实际的代码。预处理器还会将头文件中的内容复制到源文件中,形成一个完整的源代码文件。使用-E选项可以查看预处理后的代码。

    2. 编译阶段

    在这一阶段,gcc会将预处理后的源代码编译成汇编代码。gcc会对每个函数单独编译,并生成对应的汇编代码文件。使用-S选项可以查看生成的汇编代码。

    3. 汇编阶段

    在这一阶段,gcc会将汇编代码转换成机器码。汇编器会将汇编代码翻译成可执行的二进制指令,并生成目标文件。使用-c选项可以查看生成的目标文件。

    4. 链接阶段

    在这一阶段,gcc将目标文件与所依赖的库文件进行链接,生成可执行文件。链接器会将多个目标文件及其所依赖的库文件合并成一个可执行文件。使用-o选项可以指定生成的可执行文件名。

    在编译过程中,可以使用各种编译选项来控制编译过程。例如,-I选项可以指定头文件的搜索路径,-L选项可以指定库文件的搜索路径,-l选项可以指定要链接的库文件,等等。

    二、示例

    接下来以一个简单的输出helloworld的程序演示一下这个过程。

    hello.c

    #include 
    int main()
    {       
            printf("HelloWorld!");
            return 0;
    }     
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1.预处理

    预处理,生成预编译文件(.i文件)

    gcc -E hello.c -o hello.i
    
    • 1

    在这里插入图片描述

    将会产生 hello.i 文件,这就是 hello.c 经过预处理后的文件。

    Vi 打开后进行查看。可以看到, hello.c 经过预处理后得到的 hello.i文件,除了原本的几行代码之外,还包含了很多额外的变量、函数等等,这些都是预处理器处理的结果。

    2.编译

    编译,生成汇编代码(.s文件)

    gcc -S hello.i -o hello.s
    
    • 1

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    3.汇编

    得到了汇编文件后,通过 gcc 就可以得到机器码了。在终端输入下列命令,可以得到hello.o 目标文件。

    gcc -c hello.s -o hello.o
    
    • 1

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    4.链接

    尽管已经得到了机器码,但这个文件却还是不可以运行的,必须要经过链接才能得到可执行文件。

    在终端输入下列命令,将会得到可执行文件 a.out。

    gcc hello.o
    
    • 1

    a.out 是 gcc 默认输出文件名称,可以通过-o 参数指定新的文件名。例如加上“-o hello”参数,将会生成 hello 文件,这个文件和 a.out 实际上是一样的。

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    5.执行命令
    ./a.out
    
    • 1

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    补充

    上边内容也可以一步到位:

    gcc hello.c
    
    • 1

    执行命令后直接生成a.out文件。

    也可以编写Makefile文件,使用make 工具编译程序并执行。

    详细请看:https://blog.csdn.net/m0_46202060/article/details/133934816?spm=1001.2014.3001.5501

  • 相关阅读:
    每天一个数据分析题(二百七十七)
    APP安全测试详解
    密码学消息鉴别
    基于OpenVINO 2022.1 POT API实现YOLOv5模型INT8量化
    Redis学习笔记(下):持久化RDB、AOF+主从复制(薪火相传,反客为主,一主多从,哨兵模式)+Redis集群
    spring学习9-idea的config配置
    【Java八股文总结】之MyBatisPlus
    cuda 探索
    03.Pandas数据结构
    Python学习之CSDN21天学习挑战赛计划之5
  • 原文地址:https://blog.csdn.net/m0_46202060/article/details/133934925