C语言学习:C语言编译流程
回顾下C语言编译流程
在Linux操作系统下,.c文件通过gcc编译器转换成可执行文件.out
在Windows操作系统下,.c文件在集成环境下转换成可执行文件.exe
本质上两个操作系统下的编译过程都是一样的,都是经过预处理、编译、汇编和链接四个流程,如下图所示:
Linux系统下:
使用gcc编译器进行
1、预处理
cat main.i文件后发现
进行预处理工作 不会自动生成文件
去掉了注释内容
字符替换
把带 # 的内容如(宏,头文件)条件编译
把“stdio.h”文件包含进来,即用“stdio.h”中的内容替换在“#include”位置
2、编译
由.i文件到.s文件,这个过程叫编译。把高级的语言转换成机器能读懂的语言,即机器语言
简单来说,源文件被预处理之后,再以字符流的形式进行处理,进行词法和语法的分析,然后通过汇编器将源代码指令转变成汇编指令、生成相应的汇编文件。
检查源代码或者经过预处理之后代码是否有错误
3、汇编
把main.s由.s文件到.o文件,这个过程叫汇编。汇编是指把汇编语言代码翻译成目标机器指令的过程,也就是把汇编码转换成机器所能识别的二进制,通过把经过汇编之后生成的文件称为目标文件。
4、链接
链接一个或者多个目标文件生成可执行程序 默认是a.out
-o 重命名
gcc *.o 链接所有的目标文件 生成 可执行程序
由.o文件到可执行文件,这个过程叫链接。经过汇编之后生成的目标文件并不能立即被执行,还需要由链接器将代码在执行过程中用到的其他目标代码及库文件进行链接,最终生成一个可执行程序。
假如.c文件中有用到printf函数,那么就需要找到包含该函数的标准库文件,对它进行链接。
C语言学习:C语言编译流程相关推荐
- C 语言编程 — 程序的编译流程
目录 文章目录 目录 文章目录 C 程序的编译流程 预处理 编译 汇编 链接 编译多个源文件 文章目录 <C 语言编程 - GCC 工具链> <C 语言编程 - 程序的编译流程> ...
- 0. Go语言学习/Go语言教程
<Go语言学习>目录 一.开发环境准备 1 安装Go及搭建Go开发环境 2 Go跨平台编译 3 Go依赖管理及go module使用 4 使用Go module导入本地包 二.Go语言基础 ...
- go语言学习:语言简介
一.Go语言简介 Go语言(或 Golang) 起源于 2007 年,并在 2009 年正式对外发布.Go 是非常年轻的一门语言,它的主要目标是"兼具 Python 等动态语言的开发速度和 ...
- Go语言学习二 语言结构 基础语法 数据类型
Go 语言结构 由 youj 创建, 最后一次修改 2015-09-08 Go 语言结构 在我们开始学习 GO 编程语言的基础构建模块前,让我们先来了解 Go 语言最简单程序的结构. Go Hello ...
- C语言学习笔记--预编译/宏定义/数组/参数传递/函数指针
目录 预编译 值传递.指针传递.引用传递 数组 typedef 函数指针 预编译 预编译又叫预处理.预编译不是编译,而是编译前的处理.这个操作是在正式编译之前由系统自动完成的.#define 和 #i ...
- c语言数组宏定义标识符,C语言学习笔记--预编译/宏定义/数组/参数传递/函数指针...
目录 预编译 值传递.指针传递.引用传递 数组 typedef 函数指针 预编译 预编译又叫预处理.预编译不是编译,而是编译前的处理.这个操作是在正式编译之前由系统自动完成的.#define 和 #i ...
- 511遇见易语言学习易语言常量
简单的说,就是在程序运行时,其值不能被改变的量.是计算机将数据储存到内存中的一种方式,不变是相对于变量而言,没有绝对的不变. 一.了解常量 常量是一种标识符,它的值在运行期间恒定不变.常量是一个固定的 ...
- 程序员之路──如何学习C语言并精通C语言
程序员之路──如何学习C语言 学习C语言不是一朝一夕的事情,但也不需要花费十年时间才能精通.如何以最小的代价学习并精通C语言是本文的主题.请注意,即使是"最小的代价",也绝不是什么 ...
- 100以内 蝗 靓耸 6的c语言怎,C语言学习C6.ppt
C语言学习C6 循环结构程序设计 循环结构的概念 While语句的一般形式.流程图.执行过程 While语句的应用 Do--while 语句的一般形式.流程图.执行过程 Do--while 语句的应用 ...
- MySQL基础——DML语言学习\插入数据\删除数据\更新数据
接上篇文章 MySQL基础--DDL语言学习 DML语言学习 Data Manipulation Language 数据操纵语言 主要包括表记录的插入(INSERT).更新(UPDATE).删除(DE ...
最新文章
- 如何快速融入团队(二)
- 如何使用命令行清除NuGet包缓存?
- 双项通过|百度点石通过信通院「可信数据流通平台」、「联邦学习」双项测评
- DCMTK:测试DcmSCPPool类,包括DcmSCP和DcmSCU交互
- Could not load driverClass “com.mysql.jdbc.Driver“
- LeetCode 1480 一维数组的动态和
- GoAhead2.5源代码分析之1-用户管理(um.c)
- Nuro发布自家自动驾驶安全报告,提出无人车12大安全要素 | 报告下载
- php加载memcache模块
- 安卓仿苹果键盘输入法_仿ios输入法
- Excel函数、快捷键等
- 用计算机最炫民族风乐谱,最炫民族风乐谱及歌词
- DIY 手动制作自己的win pe
- dropbox无法访问后国内网盘对比选择
- MyEclipse中如何修改项目的编码格式
- 使用ffmpeg的调色板对图片压缩
- 吞吐量与并发的公式,优化和参考值
- markdown写作教程总结
- android 手机桌面,安卓手机桌面介绍:教你认识安卓手机桌面
- 用Matlab求二次多项式,matlab二次多项式拟合
热门文章
- 故障恢复 stm32_77条STM32知识,千万不能错过!干货
- 面试题:怎么以最快速度计算8*4:
- 河南理工大学计算机科学与技术怎么样,河南理工大学计算机科学与技术怎么样...
- 10年经验17张图带你进入gitflow企业项目代码版本管理的最佳实践
- MySQL(15)-----运算符和优先级查询结果拼接处理及CONCAT()、CONCAT_WAS()和GROUP_CONCAT()函数的使用
- Git(4):提交代码时忽略不必要的文件或文件夹
- 【题解】守望者的逃离
- Jmeter 接口自动化执行报错 无法找到类或者类的方法
- iOS runtime实用篇解决常见Crash
- kvm初体验之八:调整vm的vcpu, memory, disk大小