C语言-用gcc指令体验C语言编译过程
目录
- 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语言编译过程相关推荐
- c语言延空指令,单片机C语言编程空指令产生短延时怎么办.doc
单片机C语言编程空指令产生短延时怎么办.doc (6页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 7.9 积分 个人收集整理-仅供参考单片机语言编程空 ...
- 【gcc/g++】1.编译器, 编译过程和基本参数
"木叶飞舞之处" 一, gcc编译器 二, gcc的编译过程 1--完整版 1. 预处理 2. 编译 3. 汇编 4. 链接: 2--简化版 简化编译过程 3--编译完成 三, g ...
- c语言散转指令,按键C语言.doc
按键C语言 四.矩阵式键盘及其接口电路 矩阵式键盘中,行.列线分别连接到按键开关的两端,行线通过上拉电阻接到+5V上.当无键按下时,行线处于高电平状态:当有键按下时,行.列线将导通,此时,行线电平将由 ...
- C语言的预编译,程序员必须懂的知识!【预编译指令】【预编译过程】
由"源代码"到"可执行文件"的过程包括四个步骤:预编译.编译.汇编.链接.所以,首先就应该清楚的首要问题就是:预编译只是对程序的文本起作用,换句话说就是,预编译 ...
- php 中间表示语言,[转载]php 底层 探究之php编译过程及中间语言 opcode
Opcode是一种PHP脚本编译后的中间语言,就像Java的ByteCode,或者.NET的MSL,举个例子,比如你写下了如下的PHP代码: echo "Hello World"; ...
- GCC编译过程与动态链接库和静态链接库
1. 库的介绍 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 本质上来说库是一种可执行代码的二进制形式,可 ...
- 深度剖析“GCC编译器编译过程”
(这张图是本人画的并非网络图,如果有编译过程没有提到的可以提出来) 首先说说第一步 一.预编译 1.配置编译器环境 编译器在编译之前要运行配置文件通常叫configure的配置文件,一般这个配置文件 ...
- vs编译器 printf 控制台输出_【语言教程】通过语言了解GCC编译器工作过程
通过c语言了解GCC编译器如何工作的 比特 下面是c语言初学必看的打印helloworld #include int main(){ printf("hello, world\n" ...
- C 语言编程 — GCC 工具链
目录 文章目录 目录 文章目录 GCC 工具链 GCC 编译器 GCC 的常用指令选项 GCC 所遵循的部分约定规则 Binutils C 运行时库 Clang 和 LLVM 文章目录 <C 语 ...
最新文章
- VSCode 搭建Vue开发环境之Vue CLI
- 【学习笔记】8、 字符串的格式化
- Microsoft Visual Studio 正忙
- 一个实用的显示Visual Studio Code文件绝对路径的扩展应用
- 前端学习(1254):Vue前后端交互方式
- LeetCode——1721.交换链表中的节点
- mcd opc读取数据 西门子数控nx_西门子TIA+PLCSIM+MCD,构建自动化仿真系统
- android crash分析工具,Android Crash之Native Crash分析
- java弹出提示框jo类_Java JobMeta.getJobLogTable方法代码示例
- linux下安装erlang,以及cowboy的初步接触的一些环境安装
- 友勤签约中芝软件系统(上海)有限公司Oracle Crystal Ball Suite软件项目
- 转载:国内从事机器视觉领域的公司
- (附源码)php新闻发布平台 毕业设计 141646
- 把时间当作朋友 读书笔记
- 华为云MVP周峥:气象预报是个技术活,大数据、超算、AI,缺一不可
- 上海交大团队制备全球最大规模的光量子计算芯片
- 关于在win8下面安装虚拟机出现的一些问题
- win10下的edge如何打开ie的兼容性视图?
- Linux中的进程管理
- ROM、RAM、内存、内存条、外存、内部存储器、外部存储器、FLASH等之间的关系