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

【C语言】拆解C语言的编译过程

前言

        学习C语言的过程中,涉及到各种各样的关键词,在我们点击编译的时候,都会做什么呢?让我们来拆解一下

C语言的编译过程

        C语言的编译过程包括预处理、编译、汇编和链接四个主要步骤。每个步骤都有其特定的任务和输出文件类型,通过这些步骤,源代码被逐步转换为可执行的机器码。

 预处理

预处理器处理源代码中的预处理指令:

  • 预处理器处理源代码文件中的预处理指令,如#include#define等。
  • #include指令会将指定的头文件内容插入到源文件中。
  • #define指令会进行宏替换。
  • 处理所有条件编译指令(#ifdef#ifndef#endif等)。
  • 预处理后的代码通常会生成一个扩展名通常为.i的文件。
  • 删除所有注释
  • 添加行号和文件名标识,便于在调试和出错时给出具体代码位置

编译

  • 编译器将预处理后的代码转换为汇编代码。
  • 这个阶段会进行语法分析、语义分析、优化等操作。
  • 确定变量的类型,作用域及储存位置。
  • 生成的汇编代码通常保存在一个扩展名为.s的文件中。

汇编

  • 汇编器将汇编代码转换为机器码,即目标代码。
  • 确定局部变量的内存。
  • 生成的目标代码通常保存在一个扩展名为.o.obj的文件中。

链接

  • 链接器将多个目标文件和库文件链接在一起,生成最终的可执行的二进制文件。
  • 链接过程中,链接器会解决符号引用,确保所有函数和变量都能正确调用。
  • 生成的可执行文件在Windows上通常扩展名为.exe,在Unix/Linux系统上没有特定的扩展名。

举例

假设有一个C语言源文件main.c,其内容如下:

#include <stdio.h>int main() {printf("Hello, World!\n");return 0;
}
1. 预处理

使用gcc编译器的预处理命令:

gcc -E main.c -o main.i

 生成的main.i文件内容可能如下:

# 1 "main.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "main.c"# 1 "/usr/include/stdio.h" 1 3 4
...
# 2 "main.c" 2int main() {printf("Hello, World!\n");return 0;
}
2. 编译

使用gcc编译器的编译命令:

gcc -S main.i -o main.s

生成的main.s文件内容可能如下:

	.file	"main.c".section	.rodata
.LC0:.string	"Hello, World!".text.globl	main.type	main, @function
main:
.LFB0:.cfi_startprocpushq	%rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq	%rsp, %rbp.cfi_def_cfa_register 6subq	$16, %rspmovl	$.LC0, %edicall	putsmovl	$0, %eaxleave.cfi_def_cfa 7, 8ret.cfi_endproc
.LFE0:.size	main, .-main.ident	"GCC: (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0".section	.note.GNU-stack,"",@progbits

 使用gcc编译器的汇编命令:

3. 汇编

使用gcc编译器的汇编命令:

gcc -c main.s -o main.o

生成的main.o文件是二进制格式的目标文件。

4. 链接

使用gcc编译器的链接命令:

gcc main.o -o main

生成的main文件是最终的可执行二进制文件。

总结

         C语言的编译过程包括预处理、编译、汇编和链接四个主要步骤。每个步骤都有其特定的任务和输出文件类型,通过这些步骤,源代码被逐步转换为可执行的机器码。        

相关文章:

【C语言】拆解C语言的编译过程

前言 学习C语言的过程中&#xff0c;涉及到各种各样的关键词&#xff0c;在我们点击编译的时候&#xff0c;都会做什么呢&#xff1f;让我们来拆解一下 C语言的编译过程 C语言的编译过程包括预处理、编译、汇编和链接四个主要步骤。每个步骤都有其特定的任务和输出文件类型&am…...

【C++】青蛙跳跃问题解析与解法

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述第一部分&#xff1a;基本青蛙过河问题第二部分&#xff1a;石柱和荷叶问题 &#x1f4af;解题思路与分析第一部分&#xff1a;青蛙过河问题解法思路&#xff1a;递…...

自动驾驶AVM环视算法--python版本的俯视TOP投影模式

c语言版本和算法原理的可以查看本人的其他文档。《自动驾驶AVM环视算法--全景的俯视图像和原图》本文档进用于展示部分代码的视线&#xff0c;获取方式网盘自行获取&#xff08;非免费介意勿下载&#xff09;&#xff1a;链接: https://pan.baidu.com/s/1MJa8ZCEfNyLc5x0uVegto…...

Go 语言与时间拳击理论下的结对编程:开启高效研发编程之旅

一、引言 结对编程作为一种软件开发方法&#xff0c;在提高代码质量、增强团队协作等方面具有显著优势。而时间拳击理论为结对编程带来了新的思考角度。本文将以 Go 语言为中心&#xff0c;深入探讨时间拳击理论下的结对编程。 在当今软件开发领域&#xff0c;高效的开发方法和…...

Qt+OPC开发笔记(一):OPCUA介绍、open62541介绍、编译与基础环境Demo

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/144516882 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…...

ElasticSearch 常见故障解析与修复秘籍

文章目录 一、ElasticSearch启动服务提示无法使用root用户二、ElasticSearch启动提示进程可拥有的虚拟内存少三、ElasticSearch提示用户拥有的可创建文件描述符太少四、ElasticSearch集群yellow状态分析五、ElasticSearch节点磁盘使用率过高&#xff0c;read_only状态问题解决六…...

序列模型的使用示例

序列模型的使用示例 1 RNN原理1.1 序列模型的输入输出1.2 循环神经网络&#xff08;RNN&#xff09;1.3 RNN的公式表示2 数据的尺寸 3 PyTorch中查看RNN的参数4 PyTorch中实现RNN&#xff08;1&#xff09;RNN实例化&#xff08;2&#xff09;forward函数&#xff08;3&#xf…...

对rust的全局变量使用drop方法

文章目录 rust处理全局变量的策略方法1&#xff1a;在main中自动Drop全局变量 参考 rust处理全局变量的策略 Rust 的静态变量不会在程序退出时自动调用 Drop&#xff0c;因为它们的生命周期与进程绑定。 use std::sync::OnceLock;struct GlobalData {content: String, }impl …...

Node.js教程入门第一课:环境安装

对于一个程序员来说&#xff0c;每学习一个新东西的时候&#xff0c;第一步基本上都是先进行环境的搭建&#xff01; 从本章节开始让我们开始探索Node.js的世界吧! 什么是Node.js? 那么什么是Node.js呢&#xff1f;简单的说Node.js 就是运行在服务端的 JavaScript JavaScript…...

Visual Studio 使用 GitHub Copilot 扩展

&#x1f380;&#x1f380;&#x1f380;【AI辅助编程系列】&#x1f380;&#x1f380;&#x1f380; Visual Studio 使用 GitHub Copilot 与 IntelliCode 辅助编码Visual Studio 安装和管理 GitHub CopilotVisual Studio 使用 GitHub Copilot 扩展Visual Studio 使用 GitHu…...

【Qualcomm】IPQ5018获取TR069 WiFi 接口Stats状态方法

IPQ5018 简介 IPQ5018 是高通(Qualcomm)公司推出的一款面向网络设备的系统级芯片(SoC)。它通常用于路由器、接入点和其他网络设备中,提供高性能的无线网络连接。以下是关于 IPQ5018 的一些关键特性和功能: 关键特性 高性能处理器 IPQ5018 集成了多核 CPU,通常是 ARM …...

数字营销咨询,照亮企业营销数字化每一步

在快消品领域&#xff0c;面对市场竞争日益激烈的现状&#xff0c;营销端的数字化升级已经成为企业生意增长的重要驱动力。 然而&#xff0c;鉴于营销端数字化建设的高昂成本及其广泛覆盖的业务范畴&#xff0c;企业在启动此类项目之前&#xff0c;通常会遭遇一系列挑战与顾虑&…...

修改vscode中emmet中jsx和tsx语法中className的扩展符号从单引号到双引号 - HTML代码补全 - 单引号双引号

效果图 实现步骤 文件 > 首选项 > 设置搜索“”在settings.json中修改&#xff0c;增加 "emmet.syntaxProfiles": {"html": {"attr_quotes": "single"},"jsx": {"attr_quotes": "double","…...

【Cmake】

1 设置安装路径 -DCMAKE_INSTALL_PREFIX"安装路径"2 使用交叉编译 -DCMAKE_C_COMPILE"交叉编译器绝对路径"3 编译静态库 -DPAHO_BUILD_STARTTRUE...

Flutter 内嵌 unity3d for android

前言&#xff1a; 最近刚整完 unity3d hybridCLR 更新代码和资源&#xff0c;我们 趁热打铁 将 Unity3D 嵌入 Flutter 应用中。实现在 Flutter 使用 Unity3D, 可以做 小游戏 大游戏&#xff1b; 之前都是 内嵌 Webview 来实现的。虽然 CocosCreator 做出来的效果也不错&#xf…...

sqlite加密-QtCipherSqlitePlugin 上

1、下载并解压软件 https://download.csdn.net/download/notfindjob/90140129 2、编译&#xff08;可支持Qt5.12编译&#xff09; 3、安装插件...

正交投影 (Orthographic Projection) 详解

正交投影 (Orthographic Projection) 详解 正交投影是一种将三维空间中的物体投影到二维平面上的方法&#xff0c;它在计算机图形学、建筑设计、工程绘图等领域中广泛应用。与透视投影不同&#xff0c;正交投影不会随着距离的变化而改变物体的大小&#xff0c;因此所有平行线在…...

盛元广通畜牧与水产品检验技术研究所LIMS系统

一、系统概述 盛元广通畜牧与水产品检验技术研究所LIMS系统集成了检测流程管理、样品管理、仪器设备管理、质量控制、数据记录与分析、合规性管理等功能于一体&#xff0c;能够帮助实验室实现全流程的数字化管理。在水产、畜牧产品的质检实验室中&#xff0c;LIMS系统通过引入…...

三维空间刚体运动4-1:四元数表示变换(各形式相互转换加代码——下篇)

三维空间刚体运动4-1&#xff1a;四元数表示变换&#xff08;各形式相互转换加代码——下篇&#xff09; 4. 四元数到其它旋转表示的相互转换4.1 旋转向量4.2 旋转矩阵4.3 欧拉角4.3.1 转换关系4.3.2 转换中的万象锁问题 5. 四元数的其他性质5.1 旋转的复合5.2 双倍覆盖5.3 指数…...

PyTorch如何通过 torch.unbind 和torch.stack动态调整张量的维度顺序

笔者一篇博客PyTorch 的 torch.unbind 函数详解与进阶应用&#xff1a;中英双语中有一个例子如下&#xff1a; # 创建一个 3x2x2 的三维张量 x torch.tensor([[[1, 2], [3, 4]],[[5, 6], [7, 8]],[[9, 10], [11, 12]]])# 第一步&#xff1a;沿第 0 维分解为 3 个 2x2 张量 un…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

CSS | transition 和 transform的用处和区别

省流总结&#xff1a; transform用于变换/变形&#xff0c;transition是动画控制器 transform 用来对元素进行变形&#xff0c;常见的操作如下&#xff0c;它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...