• 程序编译过程(扫盲贴)


    一、目的

            很多小伙伴都是从IDE开始编程学习,记得那个时候我们用的还是VC++ IDE,不知道现在大学里面教学是否已经更新;一个代码从开始编写要最终的执行要经历多个过程,每个过程都会产生一些中间文件;下面就简单介绍一下各个过程,加深大家的理解。

    二、介绍

            

           上图就是源代码foo.c变成foo.out经历的整个过程,分别为预处理、编译、汇编、链接。

            假设我们有这样一段代码:

    1. #include
    2. int main(int argc, char **argv) {
    3. printf("hello world\n");
    4. return 0;
    5. }

    预处理

            我们的代码中有时候需要通过`#include`预处理指令包含其他头文件或者通过`#define`命令定义一些宏,这些预处理指令是在编译之前被处理的(经过预处理器处理);

            上面的代码中我们只有一个`#include`指令用来包含`stdio.h`这个头文件(因为我们需要通过printf进行一些打印)。    

    gcc -E foo.c -o foo.i

            通过`-E`选项我们指示GCC进行预处理操作,`-o`选项用于指明输出文件名 ,我们可以打开foo.i这个文件查看里面的内容(内容较多不再贴出)

    编译

            将经过预处理后代码转换成汇编代码的过程。

    gcc -S foo.i -o foo.s

    汇编

            将汇编代码转换成机器码,这一步骤会生成目标文件

    gcc -c foo.s -o foo.o

    链接  

             链接器将目标文件与其他目标文件(动态库、静态库)等链接起来生成可执行文件。

     gcc foo.o -o foo.out

    上面我们将编译的整个过程进行了分解,如果只是简单的进行编译只需要一行命令:

    gcc foo.c -o foo.out

    以上就是本篇所有内容,关于GCC的详细用法以及各个选项的含义后续有时间再分享。

  • 相关阅读:
    【从零学Python_1.5】自定义函数和类
    【数据结构】归并排序
    工作小记 编译 ffmpeg gpu 版本
    java毕业设计个人博客系统mybatis+源码+调试部署+系统+数据库+lw
    NewStarCTF2023week4-RSA Variation II
    【Linux】关于系统安装
    Java项目:SSM图书销售进销存管理系统
    Express--是第三方的框架、
    【C语言程序设计】实验 4
    Redis数据缓存(Redis的缓存击穿和穿透的区别)
  • 原文地址:https://blog.csdn.net/tianizimark/article/details/126158728