目录

  • 1 环境说明
  • 2 gcc编译步骤
    • 2.1 编辑
    • 2.2 预处理
    • 2.3 编译
    • 2.4 汇编处理
    • 2.5 链接
  • 3 一步到位的方法

1 环境说明

  • 系统:Windows
  • 编译器:gcc
  • 命令行工具:cmder (用系统自带的命令行工具也可以)

2 gcc编译步骤

# 步骤名 生成文件 功能
1 编辑(Edit) test.c 进行编码工作
2 预处理(Pre-processing) test.i #include头文件以及宏定义替换成其真正的内容
3 编译(Compiling) test.s 将经过预处理之后的程序转换成特定汇编代码(assembly code)的过程
4 汇编处理(Assembling) test.o 将上一步的汇编代码转换成机器码(machine code),生成目标文件
5 链接(Linking) test.exe 将多个目标文以及所需的库文件链接成最终的可执行文件(executable file)

2.1 编辑

编写以下代码,命名文件名为test.c

#include<stdio.h>int main() {printf("Hello World!");return 0;
}

2.2 预处理

预处理gcc指令如下:

gcc -E test.c -o test.i
  • 参数-E - 执行编译预处理
  • 参数-o - 指明输出文件的文件名

执行过后控制台没有任何输出,打开文件夹会发现生成了一个test.i文件

可以发现生成的test.i文件会比test.c文件大得多,因为进行了大量的替换,test.i文件可以通过记事本方式打开的,也可以输入指令type test.i在控制台查看,由于文件内容很多,下面仅展示最后部分,可以发现末尾部分还是我们编写的源代码,而头文件#include<stdio.h>进行了全部替换

2.3 编译

编译gcc指令如下:

gcc -S test.i -o test.s
  • 参数-S - 编译指令
  • 参数-o - 指明输出文件的文件名

执行过后控制台没有任何输出,打开文件夹会发现生成了一个test.s文件

我们这里用指令type test.s在控制台查看文件内容,可以发现程序被转换成了汇编代码

        .file   "test.c".def    __main; .scl    2;      .type   32;     .endef.section .rdata,"dr"
.LC0:.ascii "Hello World!\0".text.globl  main.def    main;   .scl    2;      .type   32;     .endef.seh_proc       main
main:pushq   %rbp.seh_pushreg    %rbpmovq    %rsp, %rbp.seh_setframe   %rbp, 0subq    $32, %rsp.seh_stackalloc 32.seh_endprologuecall    __mainleaq    .LC0(%rip), %rcxcall    printfmovl    $0, %eaxaddq    $32, %rsppopq    %rbpret.seh_endproc.ident  "GCC: (tdm64-1) 4.9.2".def    printf; .scl    2;      .type   32;     .endef

2.4 汇编处理

汇编处理gcc指令如下:

gcc -c test.s -o test.o
  • 参数-c - 汇编转机器码
  • 参数-o - 指明输出文件的文件名

执行过后控制台没有任何输出,打开文件夹会发现生成了一个test.o文件

由于文件已经是机器码了,打开文件的话显然都是乱码了,用指令type test.o在控制台查看文件内容如下:

2.5 链接

链接处理gcc指令如下:

gcc test.o -o test
  • 参数-o - 指明输出文件的文件名

执行过后控制台没有任何输出,打开文件夹会发现生成了一个test.exe文件


既然已经转换成了.exe可执行文件,在Windows操作系统下可以直接执行,直接在控制台输入test,执行结果如下:

可以发现最后输出了Hello World!那么整个过程就结束了

3 一步到位的方法

直接可以从.c文件到.exe可执行文件,这里就不演示了

gcc test.c -o test

C语言-用gcc指令体验C语言编译过程相关推荐

  1. c语言延空指令,单片机C语言编程空指令产生短延时怎么办.doc

    单片机C语言编程空指令产生短延时怎么办.doc (6页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 7.9 积分 个人收集整理-仅供参考单片机语言编程空 ...

  2. 【gcc/g++】1.编译器, 编译过程和基本参数

    "木叶飞舞之处" 一, gcc编译器 二, gcc的编译过程 1--完整版 1. 预处理 2. 编译 3. 汇编 4. 链接: 2--简化版 简化编译过程 3--编译完成 三, g ...

  3. c语言散转指令,按键C语言.doc

    按键C语言 四.矩阵式键盘及其接口电路 矩阵式键盘中,行.列线分别连接到按键开关的两端,行线通过上拉电阻接到+5V上.当无键按下时,行线处于高电平状态:当有键按下时,行.列线将导通,此时,行线电平将由 ...

  4. C语言的预编译,程序员必须懂的知识!【预编译指令】【预编译过程】

    由"源代码"到"可执行文件"的过程包括四个步骤:预编译.编译.汇编.链接.所以,首先就应该清楚的首要问题就是:预编译只是对程序的文本起作用,换句话说就是,预编译 ...

  5. php 中间表示语言,[转载]php 底层 探究之php编译过程及中间语言 opcode

    Opcode是一种PHP脚本编译后的中间语言,就像Java的ByteCode,或者.NET的MSL,举个例子,比如你写下了如下的PHP代码: echo "Hello World"; ...

  6. GCC编译过程与动态链接库和静态链接库

    1. 库的介绍 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 本质上来说库是一种可执行代码的二进制形式,可 ...

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

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

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

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

  9. C 语言编程 — GCC 工具链

    目录 文章目录 目录 文章目录 GCC 工具链 GCC 编译器 GCC 的常用指令选项 GCC 所遵循的部分约定规则 Binutils C 运行时库 Clang 和 LLVM 文章目录 <C 语 ...

最新文章

  1. VSCode 搭建Vue开发环境之Vue CLI
  2. 【学习笔记】8、 字符串的格式化
  3. Microsoft Visual Studio 正忙
  4. 一个实用的显示Visual Studio Code文件绝对路径的扩展应用
  5. 前端学习(1254):Vue前后端交互方式
  6. LeetCode——1721.交换链表中的节点
  7. mcd opc读取数据 西门子数控nx_西门子TIA+PLCSIM+MCD,构建自动化仿真系统
  8. android crash分析工具,Android Crash之Native Crash分析
  9. java弹出提示框jo类_Java JobMeta.getJobLogTable方法代码示例
  10. linux下安装erlang,以及cowboy的初步接触的一些环境安装
  11. 友勤签约中芝软件系统(上海)有限公司Oracle Crystal Ball Suite软件项目
  12. 转载:国内从事机器视觉领域的公司
  13. (附源码)php新闻发布平台 毕业设计 141646
  14. 把时间当作朋友 读书笔记
  15. 华为云MVP周峥:气象预报是个技术活,大数据、超算、AI,缺一不可
  16. 上海交大团队制备全球最大规模的光量子计算芯片
  17. 关于在win8下面安装虚拟机出现的一些问题
  18. win10下的edge如何打开ie的兼容性视图?
  19. Linux中的进程管理
  20. ROM、RAM、内存、内存条、外存、内部存储器、外部存储器、FLASH等之间的关系

热门文章

  1. 自动发布工具应该具备的11个标准特征
  2. 经典排序算法python回顾之一 交换排序
  3. 查看数据库表使用空间大小
  4. 算法系列15天速成——第三天 七大经典排序【下】
  5. 在ubuntu10.4安装snort ACID
  6. Linux入侵类问题排查思路
  7. 三维计算视觉研究内容概述
  8. ASP.NET Core 中文文档 第三章 原理(12)托管
  9. 不生成新数组的迭代器方法:forEach()every()some()reduce()reduceRight()
  10. 几个书本上不常见到的C语言函数