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

【C/C++】程序的构建(编译)过程概述

🦄个人主页:小米里的大麦-CSDN博客

🎏所属专栏:C++_小米里的大麦的博客-CSDN博客

🎁代码托管:C++: 探索C++编程精髓,打造高效代码仓库 (gitee.com)

⚙️操作环境:Visual Studio 2022

目录

一、前言

二、预处理(Preprocessing)

三、编译(Compilation)

四、汇编(Assembly)

五、链接(Linking)

总结 

各阶段输出总结

流程总结

共勉


一、前言

每个语言和环境都有其特定的构建和执行流程,但大多数都会涉及某种形式的处理,将源代码转换成机器可以直接理解的形式。在编译和构建一个 C/C++ 程序的过程中,通常会经过 预处理编译汇编链接 这四个阶段,这个过程被称为构建流程或者编译流程。每个阶段都负责将代码从一个形式转换为下一个形式,最终生成可执行文件。下面我会以一个简单的C/C++程序详细讲解每个阶段的具体过程。

注意:编译器的工作其实非常复杂,远远不是博主我这轻描淡写的两句话就能描述清楚的!想要深入了解,还需不断钻研!!!

二、预处理(Preprocessing)

预处理阶段是编译过程的第一个步骤,主要负责对代码进行宏替换、头文件展开、条件编译等操作。这一阶段的任务是将代码进行格式化标准化,方便后续的编译步骤。

  • 头文件展开#include 指令引入的头文件会被展开,将头文件中的内容插入到文件中。
  • 宏替换:预处理阶段会替换所有的宏定义,例如 #define MAX 100,在代码中使用 MAX 的地方都会被替换为 100
  • 条件编译:根据 #ifdef#ifndef 等预处理指令,编译器会有选择地包含或忽略某些代码。
  • 删除注释:所有的代码注释(///* ... */)会在预处理阶段被移除,代码中只会保留实际的指令。

输出:经过预处理的源文件会生成一个新的文件,通常扩展名为 .i,这就是纯净的、展开后的源代码文件。

例如:

#include <stdio.h>
#define PI 3.14
int main() {printf("%f\n", PI);//打印PI的值
}

预处理后:

int main() {printf("%f\n", 3.14);
}

三、编译(Compilation)

编译器会将预处理后的源代码(.i 文件)转化为汇编代码。这一阶段会对代码的语法进行检查,确保没有语法错误,并且会生成与硬件无关的汇编语言代码。

  • 语法分析:编译器会检查代码的语法,确保代码符合 C/C++ 语言规范。如果语法有问题,编译器会抛出错误。
  • 语义分析:编译器会检查变量类型、函数调用等,确保它们的使用是正确的。
  • 生成汇编代码:编译器会将源代码转换成一种与 CPU 架构无关的汇编代码。这个文件通常以 .s 作为后缀。

输出:经过编译后的文件通常以 .s 为后缀,它包含的是汇编代码。

例子(生成的汇编代码部分,大致是这样,会有部分不准确):

movl $0, %eax
call printf

四、汇编(Assembly)

在汇编阶段,汇编器会将汇编代码(.s 文件)转换成机器代码(即二进制指令)。这些二进制指令可以直接被计算机的处理器执行。

  • 汇编器会将汇编语言翻译成机器指令,这些指令以二进制格式存储在目标文件(.o.obj)中。
  • 目标文件是不可执行的,它只是包含了机器代码和一些符号信息(如变量、函数名等),供下一步的链接使用。

输出:这个阶段的输出是一个目标文件,通常以 .o.obj 作为后缀,里面包含了二进制机器代码。

五、链接(Linking)

链接是编译过程的最后一步,负责将一个或多个目标文件(.o 文件)合并,生成一个可执行文件。这个阶段包括以下几项工作:

  • 符号解析:链接器会解析每个目标文件中的符号(如函数和变量),并将它们正确地关联在一起。比如,如果一个目标文件调用了一个在另一个目标文件中定义的函数,链接器会负责将它们连接起来。
  • 库链接:链接器会将程序需要的库文件(如标准库 libc)与目标文件链接在一起,确保程序能调用库函数。
  • 地址分配:链接器会为每个符号(函数、变量)分配内存地址,使得程序在执行时可以正确访问它们。

输出:链接后的最终产物是一个可执行文件,通常命名为 a.out(在 Linux/Unix 系统中)或 .exe 文件(在 Windows 系统中)。

例子:链接后,生成的可执行文件可以直接运行,执行程序逻辑。

下面放几张图片使抽象的理解形象些:

 

总结 

各阶段输出总结

  • 预处理(Preprocessing):生成预处理后的源代码文件,通常扩展名为 .i
  • 编译(Compilation):生成汇编代码文件,通常扩展名为 .s
  • 汇编(Assembly):生成目标文件,通常扩展名为 .o.obj
  • 链接(Linking):生成可执行文件,扩展名为 a.out(Linux/Unix)或 .exe(Windows)。

流程总结

  1. 预处理:对代码做初步的处理,如头文件展开、宏替换等。
  2. 编译:将预处理后的代码转化为汇编代码,同时进行语法检查。
  3. 汇编:将汇编代码转换为机器代码,生成目标文件。
  4. 链接:将目标文件与库文件链接,生成可执行程序。

这个编译过程将源代码逐步转化为计算机可以执行的二进制机器代码,是 C/C++ 编译过程的核心。

共勉

相关文章:

【C/C++】程序的构建(编译)过程概述

&#x1f984;个人主页:小米里的大麦-CSDN博客 &#x1f38f;所属专栏:C_小米里的大麦的博客-CSDN博客 &#x1f381;代码托管:C: 探索C编程精髓&#xff0c;打造高效代码仓库 (gitee.com) ⚙️操作环境:Visual Studio 2022 目录 一、前言 二、预处理&#xff08;Preprocessi…...

ElasticSearch-2-核心语法集群高可用实战-Week2

ES批量操作 1.批量获取文档数据 这里多个文档是指&#xff0c;批量操作多个文档&#xff0c;搜索查询文档将在之后的章节讲解 批量获取文档数据是通过_mget的API来实现的 (1)在URL中不指定index和type 请求方式&#xff1a;GET 请求地址&#xff1a;_mget 功能说明 &#…...

STM的CAN通信学习

显性电平&#xff1a;0 隐性电平&#xff1a;1 一、帧结构 1.帧类型 1&#xff09;数据帧&#xff1a;发送设备主动发送数据&#xff08;广播式&#xff09; 2&#xff09;请求帧&#xff1a;接收设备主动请求数据&#xff08;请求式&#xff09; 2.帧结构 1&#xff…...

【高等数学学习记录】函数

【高等数学&学习记录】函数 从事测绘工作多年&#xff0c;深刻感受到基础知识的重要及自身在这方面的短板。 为此&#xff0c;打算重温测绘工作所需基础知识。练好基本功&#xff0c;为测绘工作赋能。 1 知识点 1.1 函数 设数集 D ⊂ R D\subset R D⊂R&#xff0c;称映射…...

【springboot过ingress后无法获取X-Forwarded-For头信息】

springboot过ingress后无法获取X-Forwarded-For头信息 一、现象结论修改步骤ingressspringboot 排查流程本文参考 一、现象 项目使用spring boot 2.7.18&#xff0c;有个新需求是校验X-Forwarded-For头的所有来源ip合法性&#xff0c;线上环境出现取不到X-Forwarded-For头的问…...

表格标记<table>

一.表格标记、 1table&#xff1a;表格标记 2.caption:表单标题标记 3.tr:表格行标记 4.td:表格中数据单元格标记 5.th:标题单元格 table标记是表格中最外层标记&#xff0c;tr表示表格中的行标记&#xff0c;一对<tr>表示表格中的一行&#xff0c;在<tr>中可…...

Rust练手项目,写个有趣的小工具定时从一言网获取一段有趣的话并推送通知

Rust练手项目&#xff0c;写个有趣的小工具 代码 继续练习Rust, 写个小工具定时从一言网获取一段有趣的话并提示&#xff0c;如下 练习以下Rust点 并发编程 Mutex, Arc指针使用HTTP请求Windows Gui 代码 Cargo.toml [package] name "funny_word" edition "20…...

【隐私计算】Paillier半同态加密算法

一、何为同态加密&#xff08;HE&#xff09;&#xff1f; HE是一种特殊的加密方法&#xff0c;它允许直接对加密数据执行计算&#xff0c;如加法和乘法&#xff0c;而计算过程不会泄露原文的任何信息。计算的结果仍然是加密的&#xff0c;拥有密钥的用户对处理过的密文数据进…...

判断数字的奇偶[中秋快乐~]

题目描述 给定一个整数 n,编写程序判断数字 n 是奇数还是偶数&#xff0c;是奇数则输出 “odd”&#xff0c;偶数则输出 “even”。 输入格式 一行&#xff0c;一个整数 n。 输出格式 一行&#xff0c;如果 n 是奇数则输出 “odd”; 如果 nn 是偶数则输出 “even”。 样例…...

文件操作及重定向详解

1、linux下一切皆文件: 在linux中,一切皆文件是一个重要的概念,用于描述linux操作系统中所有资源和设备都以文件的形式进行访问和处理。 这个概念可以理解为,无论是硬盘上的文件、网卡、设备、进程等,都被抽象为文件的形式存在。在linux系统中,通…...

鸿蒙next json解析 ArkUI 带你玩转 arkts json解析

前言导读 相信很多同学再开发过程中都会遇到json解析的处理&#xff0c;不管是跟服务端交互 或者是读取本地的json 都会遇到json解析 那么正好今天有空正好讲一下鸿蒙next里面的json解析 JSON解析与生成 本模块提供了将JSON文本转换为JSON对应对象或值&#xff0c;以及将对象…...

东土科技加码芯片业务投资,携手神经元共建新型工业生态

为抢抓国产化芯片发展的重大机遇&#xff0c;东土科技决定进一步加大对神经元信息技术&#xff08;成都&#xff09;有限公司的投资。这一战略布局有利于东土科技鸿道Intewell工业操作系统与神经元公司芯片的深度协同&#xff0c;推动实现“信息技术、网络技术、控制技术、数字…...

指纹与指甲检测系统源码分享

指纹与指甲检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer V…...

C++3D迷宫

目录 开头程序程序的流程图程序游玩的效果下一篇博客要说的东西 开头 大家好&#xff0c;我叫这是我58。 程序 #include <iostream> using namespace std; void printmaze(char strmaze[5][5][5]) {cout << "-----" << endl;int i 0;int ia 0…...

跨界融合,GIS如何赋能游戏商业——以《黑神话:悟空》为例

在数字化时代&#xff0c;地理信息系统&#xff08;GIS&#xff09;技术正以其独特的空间分析和可视化能力&#xff0c;为游戏产业带来革命性的变革。《黑神话&#xff1a;悟空》作为中国首款3A级别的动作角色扮演游戏&#xff0c;不仅在游戏设计和技术上取得了突破&#xff0c…...

【计网】从零开始使用TCP进行socket编程 --- 客户端与服务端的通信实现

阵雨后放晴的天空中&#xff0c; 出现的彩虹很快便会消失。 而人心中的彩虹却永不会消失。 --- 太宰治 《斜阳》--- 从零开始使用TCP进行socket编程 1 TCP与UDP2 TCP服务器类2.1 TCP基础知识2.2 整体框架设计2.3 初始化接口2.4 循环接收接口与服务接口 3 服务端与客户端测试…...

Imagen:重塑图像生成领域的革命性突破

目录 引言 一、Imagen模型的技术原理 1. 模型概述 2. 工作流程 3. 技术创新 二、Imagen模型的应用实例 1. 创意设计 2. 虚拟角色制作 3. 概念可视化 三、Imagen模型的优势与挑战 1. 优势 2. 挑战 四、Imagen模型的未来发展方向 1. 图像生成质量的提升 2. 多模态…...

Golang | Leetcode Golang题解之第402题移掉K位数字

题目&#xff1a; 题解&#xff1a; func removeKdigits(num string, k int) string {stack : []byte{}for i : range num {digit : num[i]for k > 0 && len(stack) > 0 && digit < stack[len(stack)-1] {stack stack[:len(stack)-1]k--}stack app…...

c++ gtsam/inference/Symbol.h 详细介绍

gtsam/inference/Symbol.h 是 GTSAM 库中的一个头文件&#xff0c;定义了 Symbol 类。这个类用于在因子图优化中标识和管理变量。Symbol 提供了一种便捷的方式来创建和使用唯一标识符&#xff0c;从而避免手动管理复杂的整数键。 Symbol 类详细介绍 Symbol 类是 GTSAM 中用于…...

apache文件共享和访问控制

实现apache文件共享 文件共享路径 <Directory "/var/www/html"> #默认发布路径&#xff0c;功能限制 Options Indexes FollowSymLinks #indexes支持文件共享功能 AllowOverride None Require all granted </Directory> 进入到该路径下 cd…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

Razor编程中@Html的方法使用大全

文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...

Caliper 配置文件解析:fisco-bcos.json

config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

适应性Java用于现代 API:REST、GraphQL 和事件驱动

在快速发展的软件开发领域&#xff0c;REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名&#xff0c;不断适应这些现代范式的需求。随着不断发展的生态系统&#xff0c;Java 在现代 API 方…...

02.运算符

目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&&#xff1a;逻辑与 ||&#xff1a;逻辑或 &#xff01;&#xff1a;逻辑非 短路求值 位运算符 按位与&&#xff1a; 按位或 | 按位取反~ …...

基于江科大stm32屏幕驱动,实现OLED多级菜单(动画效果),结构体链表实现(独创源码)

引言 在嵌入式系统中&#xff0c;用户界面的设计往往直接影响到用户体验。本文将以STM32微控制器和OLED显示屏为例&#xff0c;介绍如何实现一个多级菜单系统。该系统支持用户通过按键导航菜单&#xff0c;执行相应操作&#xff0c;并提供平滑的滚动动画效果。 本文设计了一个…...

CTF show 数学不及格

拿到题目先查一下壳&#xff0c;看一下信息 发现是一个ELF文件&#xff0c;64位的 ​ 用IDA Pro 64 打开这个文件 ​ 然后点击F5进行伪代码转换 可以看到有五个if判断&#xff0c;第一个argc ! 5这个判断并没有起太大作用&#xff0c;主要是下面四个if判断 ​ 根据题目…...

基于stm32F10x 系列微控制器的智能电子琴(附完整项目源码、详细接线及讲解视频)

注&#xff1a;文章末尾网盘链接中自取成品使用演示视频、项目源码、项目文档 所用硬件&#xff1a;STM32F103C8T6、无源蜂鸣器、44矩阵键盘、flash存储模块、OLED显示屏、RGB三色灯、面包板、杜邦线、usb转ttl串口 stm32f103c8t6 面包板 …...