gcc hello.c   ./a.out     或者 gcc hello.c -o hello   ./hello

./表示执行当前目录下的可执行程序或脚本程序。

首先gcc需要调用预处理程序cpp,由它负责展开在源文件中定义的宏,并向其中插入“#include”语句所包含的内容;接着gcc会调用编译程序ccl和汇编程序as将处理后的源代码编译成目标代码;最后,gcc会调用链接程序ld,把生成的目标代码链接成一个可执行程序。其实gcc本身只是做了编译这一项工作,其余阶段的工作都是gcc调用其余服务程序来完成的。

预处理阶段。gcc把预处理命令扫描处理完毕,输入C语言的源文件(.c),这个阶段主要处理源文件中的#ifdef、#include、#define等预处理命令,该阶段会生成一个中间文件.i。可以使用-E参数让gcc在预处理阶段结束后停止编译过程,从而生成经过预处理的C源代码文件:gcc -E hello.c –o hello.i  vim hello.i  //查看该文件实际的变化      该阶段详细情况举例说明说明如下:

//head.h
#ifndef __HEAD_H__
#define __HEAD_H__#define NUM1 10
#define NUM2 20
#endif//sum.c
#include <stdio.h>  //直接在标准库中查找
#include "head.h"   //先在工作目录中查找,找不到再去标准库中查找
#define DEBUG     //去掉这一行,gcc编译时采用-D参数即可,生成最终文件时,不用-D参数。
int main(void)
{int a = NUM1;int aa;int b = NUM2;int sum = a + b;// 小盆友: 这是一个加法运算
#ifdef DEBUGprintf("The sum value is: %d + %d = %d\n", a, b, sum);
#endifreturn 0;
}

如上段代码中,有两个文件,一个头文件head.h和一个c语言源代码文件sum.c。执行gcc -E sum.c -o sum.i后,打开sum.c可以看到如下内容:

//这上面还有很多内容,全是stdio.h头文件的内容
extern int ftrylockfile (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)) ;extern void funlockfile (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__));
# 943 "/usr/include/stdio.h" 3 4# 2 "sum.c" 2
# 1 "head.h" 1
# 3 "sum.c" 2int main(void)
{int a = 10;int aa;int b = 20;int sum = a + b;return 0;
}

可以看到在预处理过程中,预处理程序主要做了以下几件事情:1.处理#include,将所有头文件的内容都全部包含进来;2.处理掉所有的条件预编译命令,#ifdef   #ifndef  #endif等;3.删除所有的#define,并且展开所有的宏定义,即字符替换;4.删除所有注释;5.添加行号和文件标识,这样在调试和编译出错时才知道是哪个文件哪一行的问题;5.保留#pragma编译器指令,因为编译器在编译过程中需要使用它们。

#pragma para(其中para为参数)编译器指令的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma 指令对每个编译器给出了一个方法,在保持与C 和C ++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。

编译阶段。gcc把预处理后的结果编译成汇编语言代码,输入的是.i,编译后生成汇编语言文件.s:gcc -S hello.i –o hello.s  vim hello.s    hello.s为汇编语言代码(没学过汇编的表示也看不懂!!)

汇编阶段。编译器把编译出来的汇编语言汇编成具体CPU上的目标代码(机器代码)。输入汇编代码文件.s,输出目标代码文件.o或.obj:gcc –c hello.s –o hello.o  vim hello.o  .o文件也是一个二进制代码文件,只是还不能执行,需要进行链接。

链接阶段。把多个目标代码模块链接成一个大的目标代码模块。输入目标代码文件.0(与其它的目标代码文件、库文件、引导代码),汇集成一个可执行的二进制代码文件:  gcc hello.o –o hello  vim hello       执行: ./hello

后续(操作系统范畴):机器代码hello在操作系统机器上解释操作系统的;然后在机器语言机器上被翻译称为一个个微程序;最后,微程序的每一条微指令在微指令系统上执行。

gcc编译器的整个工作过程相关推荐

  1. 看inux系统中的c语言编译器,Linux系统自定义安装C语言gcc编译器图文详细教程

    有些Linux系统自带gcc编译器,有些则不带,比如CentOS版本的系统就没有gcc,我们在安装一些C语言开发的软件时,就没有办法进行编译,那就需要我们手动进行安装gcc,手动安装较麻烦,依赖了一些 ...

  2. vs编译器 printf 控制台输出_【语言教程】通过语言了解GCC编译器工作过程

    通过c语言了解GCC编译器如何工作的 比特 下面是c语言初学必看的打印helloworld #include int main(){ printf("hello, world\n" ...

  3. linux g 编译目录下,你真的了解Linux下gcc编译器的工作过程吗?

    小豆丁:老张!老张! 老张:干嘛? 小豆丁:咋啦?愁眉苦脸的,是不是又被媳妇给揍了? 老张:开玩笑,我在家那就是相当于老虎的存在,谁敢揍我! 媳妇:老张,你说啥?我没听清,你再说一遍? 老张:我是老虎 ...

  4. gcc编译器及编译过程

    GCC编译器 GCC(GNU Compiler Collection,即 GNU 编译器套装),是一套由 GNU 开发的编程 语言编译器.它是一套以 GPL 及 LGPL 许可证所发行的自由软件,也是 ...

  5. 深度剖析“GCC编译器编译过程”

    (这张图是本人画的并非网络图,如果有编译过程没有提到的可以提出来) 首先说说第一步 一.预编译 1.配置编译器环境  编译器在编译之前要运行配置文件通常叫configure的配置文件,一般这个配置文件 ...

  6. 执行引擎的工作过程、Java代码编译和执行的过程、解释器、JIT编译器

    执行引擎概述 执行引擎是Java虛拟机核心的组成部分之一. "虚拟机"是-一个相对于"物理机"的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接 ...

  7. Linux下的vim编辑器与gcc编译器及静动态库的制作

    1.vim编辑器的使用: (1)vim的三种模式: 命令模式:打开文件默认进入命令模式 编辑模式:需要输入一些命令切换到编辑模式 末行模式:在末行模式可以输入一些命令 命令模式aios和AIOS都可以 ...

  8. 1.2.4 计算机的工作过程(从源程序到可执行文件、指令执行过程的描述)

    文章目录 1.计算机工作过程分为三步骤 2.从源程序到可执行文件 (1)预处理阶段 (2)编译阶段 (3)汇编阶段 (4)链接阶段 3.指令执行过程的描述 举个例子 (1)取指令:PC->MAR ...

  9. 【CentOS Linux 7】【gcc编译器】

    Linux系统及应用---调研报告 [CentOS Linux 7]实验1[VMware安装.新建虚拟机:63个基础命令运行结果图] [CentOS Linux 7]实验2[Shell编程及应用] [ ...

最新文章

  1. innodb表 手工导入导出
  2. Sql Server'不允许保存更改'错误►防止保存需要重新创建表的更改
  3. ​【安全牛学习笔记】操作系统识别
  4. iOS高仿城觅应用客户端项目(开发思路和代码)
  5. SVN禁止提交部分文件
  6. ttl电路制作pong游戏_如何玩Mozilla Firefox的隐藏的独角兽Pong游戏
  7. 聊聊、Spring 第二篇
  8. Leetcode639. Decode Ways II
  9. java调用opencv人脸识别 error insufficient out of memory
  10. 2.9.PHP7.1 狐教程-【控制语句 循环】
  11. 数据结构-第10周作业(二叉树的创建和遍历算法)
  12. windos无法对计算机进行,电脑提示windows无法完成格式化如何解决
  13. 共筑未来 | 思腾合力加入光合组织,完成国产信创兼容适配
  14. 在中断函数和MAIN函数中同时调用同一个函数的有趣现象
  15. 51nod 1770数数字(找规律)
  16. 西瓜玲子5.20打卡日记
  17. visual studio 2022配置GAMP出现realloc不能开辟空间问题和不能够创建文件夹问题及其解决方法
  18. 基于JAVAWeb商铺租赁管理系统计算机毕业设计源码+数据库+lw文档+系统+部署
  19. 用函数编程计算反馈意见的平均数(Mean)、中位数(Median)和众数(Mode)
  20. 教程篇(7.2) 11. 安全架构 FortiGate安全 ❀ Fortinet网络安全专家 NSE4

热门文章

  1. UITableView知识梳理须知—(一)
  2. C:打印菱形(自己的方法)
  3. 17joys网站后台功能设计-阶段1
  4. jQuery 1.2 带来的兼容问题及对策
  5. android运行时状态,Android 如何保存Android 运行时状态
  6. core和node开发小程序_node+微信小程序实现商城案例
  7. php中trim的用法和例子,PHP ltrim()用法及代码示例
  8. 西门子数控面板图解_学好四要点让你迅速成为数控机床“操作高手”
  9. python自带sqlite库_Python标准库之sqlite3使用实例
  10. 计算几何问题 java_【转载】ACM计算几何题目推荐