• 分步编译一个C语言文件


    一、 以下是C程序一般的编译过程:

     从图中看到:

          将编写的一个c程序(源代码 )转换成可以在硬件上运行的程序(可执行代码 ),需要进行编译阶段  和链接这两个阶段。

          其中,

          1.  编译阶段先通过“编译器 “把一个 .c / .cpp 源代码 编译成 .s的汇编代码 ;再经过“汇编器 ” 把这 个.s的汇编代码汇编成 .o 的 目标代码

          2.  “连接器 “ 通过连接其他 .o 代码(如果需要的话) 库文件 和 1 中的.o 目标代码生成可执行文件

    该文件流被这三种程序(红色)的加工,分别表现出四种形式(蓝色) ,这就是c程序的编译和链接过程。如果再详细的话,编译器在将源文件编译成汇编文件的过程又分为:预处理阶段(生成 .i代码) 和  优化阶段

    二、C编程中的文件后缀名介绍

        .c 未经过预处理的C源码

        .h C头文件  

        .i 经过预处理的C源码          加入头文件内容

        .s 生成的汇编语言代码           文本格式的 低级机器语言指令

        .o 编译之后产生的目标文件      二进制文件
        解释:*.c一般使我们自己编辑的代码,使我们劳动的结晶;

    *.h一般是我们手工生成的接口文件,如果愿意,也可在*.c完成后用GCC的选项-aux-info帮我们生成;

    *.i是经过预处理后的源码,是由GCC在选项-E编译下自动生成的文件;

    *.o是编译后产生的目标文件;

    *.s是GCC在选项-S编译下生成的汇编语言代码,对于性能要求很高的程序可以先生成汇编语言文件并对汇编做优化,然后用优化后的汇编生成目标文件并链接

    三 演示 hello.c 的编译 过程(Linux 下 Gcc)

        

             本小节的演示都针对文件 hello.c 进行

       1. /*
       2.  * hello.c
       3.  */
       4.
       5.   #include <stdio.h>
       6.   int  main()
       7.   {
       8.     printf(" Better goal, Better life! /n");
       9.     return 0;
      10.   }

      1.生成预处理后的文件 hello.i

         $ gcc -E hello.c -o hello.i

      2 .生成汇编语言文件 hello.s

          $ gcc -s hello.i -o hello.s

       3.生成目标文件 hello.o

          $ gcc -c hello.i
          $ gcc -c hello.s

       4. 生成可执行文件

          $ gcc -o hello hello.o

       5. 运行及结果

          $ ./hello

          HelloWorld

    当然也可以直接生成, $ gcc -c hello.c  就可以生成可执行文件

  • 相关阅读:
    让c像python一样可以在命令行写代码并且编译
    动态链接库找不到 : error while loading shared libraries: libgsl.so.0: cannot open shared object file: No such file or directory
    为什么shell中变量赋值不能有空格
    在hyper安装openwrt
    linux扩展lvm磁盘
    docker的基本使用
    tmux与vim主题不一致
    linux centos cli all proxy
    couchDB入门
    tmux复制到windows剪贴板/粘贴板的坑
  • 原文地址:https://www.cnblogs.com/maxiaodoubao/p/4748102.html
Copyright © 2020-2023  润新知