当前位置: 首页 > news >正文

C语言编译的过程

文章目录

      • 1. 预处理(Preprocessing)
      • 2. 编译(Compilation)
      • 3. 汇编(Assembly)
      • 4. 链接(Linking)
      • 总结

在这里插入图片描述
c语言通过编译器直接编译成机器语言程序。
在这里插入图片描述

C语言程序的编译过程通常分为四个主要步骤:预处理、编译、汇编和链接。下面我来详细讲述一下每个步骤的具体作用和过程。

1. 预处理(Preprocessing)

在这个阶段,C语言的预处理器(如cpp)会对源代码文件(通常是以.c为后缀的文件)进行预处理。预处理器会执行以下操作:

  • 宏替换:预处理器会用定义的宏来替换代码中的宏调用。例如,#define MAX 100 会将代码中出现的MAX替换为100
  • 头文件包含:预处理器会将通过#include指令包含的头文件的内容插入到源文件中。例如,#include <stdio.h>会将stdio.h头文件的内容插入到代码中。
  • 条件编译:根据条件编译指令(如#ifdef#ifndef等),预处理器可以选择性地包含或排除代码的某些部分。
  • 删除注释:预处理器会删除代码中的注释,使其不会影响后续的编译过程。

预处理的输出是一个纯C代码文件,通常以.i为后缀。

2. 编译(Compilation)

编译器(如gcc)会将预处理后的C代码文件(.i文件)转换成汇编代码文件。这个阶段的主要任务包括:

  • 语法分析:编译器检查代码的语法是否正确。如果语法错误,编译过程将停止,并且会报告错误信息。
  • 语义分析:编译器检查代码的逻辑是否有意义,例如类型检查、变量的作用域检查等。
  • 优化:编译器可能会对代码进行一些优化,例如循环优化、常量折叠等,以提高生成代码的执行效率。
  • 生成汇编代码:编译器根据分析结果将C代码转换为汇编代码,这些汇编代码是针对特定处理器架构的指令集编写的。

编译的输出是一个汇编代码文件,通常以.s为后缀。

3. 汇编(Assembly)

汇编器(如as)会将汇编代码文件(.s文件)转换成目标机器的机器码(即二进制指令),生成目标文件。这个阶段的主要任务是:

  • 翻译汇编代码:将汇编代码中对应的指令翻译成二进制机器码,这些机器码可以被计算机直接执行。
  • 地址分配:分配变量、函数等在内存中的地址,处理汇编代码中的符号引用。

汇编的输出是一个目标文件,通常以.o(在Unix/Linux系统)或.obj(在Windows系统)为后缀。

4. 链接(Linking)

链接器(如ld)会将一个或多个目标文件(.o文件)和库文件(如标准库)合并,生成最终的可执行文件。在这个阶段,链接器会:

  • 符号解析:解析所有目标文件和库文件中的符号引用,确定它们的实际地址。如果某个符号无法解析,链接器会报告错误。
  • 合并代码段:将各个目标文件中属于同一段的代码(如代码段、数据段等)合并到一起。
  • 处理外部库:将程序中使用的外部库(如C标准库libc)的代码和程序本身的代码链接在一起。

链接的输出是最终的可执行文件,通常在Unix/Linux系统上没有后缀,在Windows系统上是.exe文件。

总结

  • 预处理:处理宏替换、头文件包含、条件编译,输出纯C代码。
  • 编译:将预处理后的C代码翻译成汇编代码。
  • 汇编:将汇编代码转换成机器代码,生成目标文件。
  • 链接:将多个目标文件及库文件链接为一个可执行文件。

这个过程确保了从C源代码到可执行文件的转换,使得最终的程序能够在目标机器上运行。

相关文章:

C语言编译的过程

文章目录 1. 预处理&#xff08;Preprocessing&#xff09;2. 编译&#xff08;Compilation&#xff09;3. 汇编&#xff08;Assembly&#xff09;4. 链接&#xff08;Linking&#xff09;总结 c语言通过编译器直接编译成机器语言程序。 C语言程序的编译过程通常分为四个主要步…...

前端面试题——栈与队列、动态路由、链表

栈、队列与链表 Java数据结构栏目总结-CSDN博客 栈&#xff08;Stack&#xff09; 栈是一种后进先出&#xff08;LIFO, Last In First Out&#xff09;的数据结构。它只允许在栈顶进行添加&#xff08;push&#xff09;或删除&#xff08;pop&#xff09;元素的操作。 基本操…...

Java算法之计数排序(Counting Sort)

简介 计数排序是一种线性时间复杂度的排序算法&#xff0c;它不依赖于元素之间的比较&#xff0c;而是通过统计数组中每个元素出现的次数&#xff0c;然后根据这些统计信息对元素进行排序。这种算法特别适用于整数且整数的范围不是非常大时。 算法步骤 找出数组中的最大值。…...

【系统架构设计师-2012年】综合知识-答案及详解

更多内容请见&#xff1a; 备考系统架构设计师-核心总结索引 文章目录 【第1~2题】【第3~4题】【第5题】【第6题】【第7题】【第8题】【第9题】【第10~11题】【第12~13题】【第14~19题】【第20~21题】【第22~24题】【第25~26题】【第27~31题】【第32~33题】【第34~36题】【第37…...

webpack4手动搭建Vue项目

小满视频 很多解释使用通义灵码搜的,通义灵码的搜索结果也是有错误的全程使用pnpm包管理工具&#xff0c;和npm的用法基本一样 学习总结 1. 多看看webpack官网 2. webpack的作用&#xff1a;配置一堆东西&#xff0c;达到运行程序的目的 3. 无论什么东西都转成js&#xff0c;…...

Python爬虫所需的技术及其原理(简单易懂)

导言 随着互联网的发展&#xff0c;大量的数据被存储在网络上&#xff0c;而我们需要从中获取有用的信息。Python作为一种功能强大且易于学习的编程语言&#xff0c;被广泛用于网络爬虫的开发。本文将详细介绍Python爬虫所需的技术及其原理&#xff0c;并提供相关的代码案例。…...

FxFactory 8 for Mac 视觉特效插件包安装

Mac分享吧 文章目录 介绍页面效果一、下载软件二、开始安装1、Install安装2、显示软件页面&#xff0c;表示安装成功3、补丁安装 三、注意事项1、若已安装过其他版本&#xff0c;需要使用软件自带的卸载功能进行软件卸载&#xff0c;再安装此版本 安装完成&#xff01;&#x…...

将语义分割的标签转换为实例分割(yolo)的标签

语义分割的标签&#xff08;目标处为255&#xff0c;其余处为0&#xff09; 实例分割的标签&#xff08;yolo.txt&#xff09;,描述边界的多边形顶点的归一化位置 绘制在原图类似蓝色的边框所示。 废话不多说&#xff0c;直接贴代码&#xff1b; import os import cv2 imp…...

QT 遍历ini配置文件

在 Qt 中&#xff0c;处理 INI 配置文件是一项常见任务&#xff0c;通常使用 QSettings 类来读取和写入这些文件。QSettings 提供了一种方便的方式来操作 INI 文件中的配置数据。下面是如何使用 QSettings 遍历和处理 INI 配置文件的示例。 示例代码 假设有一个名为 config.i…...

ecmascript和javascript的区别详细讲解

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; ECMAScript 和 JavaScript是紧密相关的术语&#xff0c;但它们有着各自明确的定义和用途。要理解它们的区别&#xff0c;首先需要从它们的起源、发展历史、技术架构以及具体应用领域来分析。以下是对它们的详…...

【Python报错已解决】“ModuleNotFoundError: No module named ‘timm‘”

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引言&#xff1a;一、问题描述1.1 报错示例&#xff1a;当我们尝试导入timm库时&#xff0c;可能会看到以下错误信息。…...

「图::存储」链式邻接表|链式前向星(C++)

前置知识 上一节我们介绍了三种基本的存图结构&#xff1a; 「图」邻接矩阵|边集数组|邻接表&#xff08;C&#xff09; 概述 他们各有优劣&#xff0c;为了综合他们的性能&#xff0c; 这一节我们来介绍两种以这三种结构为基础实现的高级存储结构&#xff1a;链式邻接表|…...

《Cloud Native Data Center Networking》(云原生数据中心网络设计)读书笔记 -- 10数据中心中的BGP

本章解答以下问题&#xff1a; ASN&#xff0c;团体&#xff08;community&#xff09;&#xff0c;属性&#xff08;attribute&#xff09;&#xff0c;最佳路径这些BGP术语是什么疑似&#xff1f;在数据中心中应该使用eBGP还是iBGP?在数据中心使用BGP时&#xff0c;应采用什…...

unity游戏开发——标记物体 一目了然

Unity游戏开发:标记物体,让开发变得一目了然 “好读书&#xff0c;不求甚解&#xff1b;每有会意&#xff0c;便欣然忘食。” 本文目录&#xff1a; Unity游戏开发 Unity游戏开发:标记物体,让开发变得一目了然前言1. 什么是Tag&#xff1f;2. Unity中如何添加和管理Tag步骤1&am…...

vue 项目打包图片没有打包进去问题解决

解决方法1.在导入图片的文件中通过 import 引入图片 这种方法只适合图片少的情况 <template> <img :srctestImg/> </template> <script> import testImg from /assets/img/testImg.png </script>2.封装公共方法,通过 new URL() 的方式…...

TCP的传输速度

如何确定TCP最大传输速度&#xff1f; TCP 的传输速度&#xff0c;受限于发送窗⼝&#xff0c;接收窗⼝以及⽹络设备传输能⼒。 其中&#xff0c;窗⼝⼤⼩由内核缓冲区⼤⼩决定。如果缓冲区与⽹络传输能⼒匹配&#xff0c;那么缓冲区的利⽤率就达到了最⼤化。 如何计算网络传…...

直播间的“骆驼”比沙漠还多?刀郎演唱会惊现“骆驼”

“送战友&#xff0c;踏征程&#xff0c;默默无语两行泪&#xff0c;耳边响起驼铃声……”8月30日&#xff0c;刀郎知交线上演唱会在微信视频号直播。一曲《驼铃》&#xff0c;勾起了无数人的回忆&#xff0c;离别的伤感、人性的关怀与温暖&#xff0c;通过悠然的旋律流入千万听…...

Android Studio gradle下载太慢了!怎么办?(已解决)

Android Studio&#xff01;你到底干了什么&#xff1f;&#xff01; 不能高速下载gradle&#xff0c;我等如何进行app编程&#xff1f;&#xff01; 很简单&#xff0c;我修改gradle地址不就是了。 找到gradle-wrapper.properties文件 修改其中distributionUrl的地址。 将 ht…...

安卓版Infuse来了 打造自己的影视墙

如何让安卓设备上的视频播放更高效&#xff1f;AfuseKt 或许能给出答案 AfuseKt 是一款功能强大的安卓网络视频播放器&#xff0c;专为满足用户对多样化媒体播放需求而设计。它不仅支持多种流行的在线存储和媒体管理平台&#xff0c;如阿里云盘、Alist、WebDAV 和 Emby 等&…...

【Python时序预测系列】高创新模型:基于xlstm模型实现单变量时间序列预测(案例+源码)

这是我的第351篇原创文章。 一、引言 LSTM在1990年代被提出&#xff0c;用以解决循环神经网络&#xff08;RNN&#xff09;的梯度消失问题。LSTM在多种领域取得了成功&#xff0c;但随着Transformer技术的出现&#xff0c;其地位受到了挑战。如果将LSTM扩展到数十亿参数&#…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

android13 app的触摸问题定位分析流程

一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...

MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用

文章目录 一、背景知识&#xff1a;什么是 B-Tree 和 BTree&#xff1f; B-Tree&#xff08;平衡多路查找树&#xff09; BTree&#xff08;B-Tree 的变种&#xff09; 二、结构对比&#xff1a;一张图看懂 三、为什么 MySQL InnoDB 选择 BTree&#xff1f; 1. 范围查询更快 2…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案

在大数据时代&#xff0c;海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构&#xff0c;在处理大规模数据抓取任务时展现出强大的能力。然而&#xff0c;随着业务规模的不断扩大和数据抓取需求的日益复杂&#xff0c;传统…...