c++中cpp文件从编译到执行的过程

C++ 文件从编写到执行的过程可以分为几个主要阶段:编写代码、预处理、编译、汇编、链接和运行。以下是每个阶段的详细说明:

1. 编写代码

这是整个过程的起点。程序员使用文本编辑器(如 VSCode、Sublime Text 或其他 IDE)编写 C++ 源代码文件(通常以 .cpp.cc 为扩展名)。

2. 预处理(Preprocessing)

预处理阶段主要处理源代码中的预处理指令,如 #include#define#ifdef 等。预处理器会读取源代码文件,并根据预处理指令生成一个扩展后的文件,通常以 .i.ii 为扩展名。

主要任务:
  • 处理 #include 指令:将被包含的头文件内容插入到源代码中。

  • 处理宏定义:展开宏定义,替换宏调用。

  • 条件编译:根据 #ifdef#ifndef#if 等指令,决定哪些代码段需要保留,哪些需要删除。

3. 编译(Compilation)

预处理后的文件会被编译器(如 GCC、Clang 或 MSVC)进一步处理,将其转换为汇编语言代码。编译器会检查语法错误、语义错误,并将 C++ 代码转换为低级的汇编语言代码。生成的文件通常以 .s 为扩展名。

主要任务:
  • 语法分析:检查代码是否符合 C++ 语法。

  • 语义分析:检查代码的逻辑是否正确,例如变量是否已声明,类型是否匹配等。

  • 代码生成:将高级语言代码转换为汇编语言代码。

4. 汇编(Assembly)

汇编器(如 GNU Assembler)将汇编语言代码转换为机器代码,生成目标文件(Object File)。目标文件是一个二进制文件,包含可重定位的机器代码,通常以 .o.obj 为扩展名。

主要任务:
  • 将汇编语言指令转换为机器代码

  • 生成符号表:包含函数和变量的名称及其地址。

5. 链接(Linking)

链接器(如 GNU Linker)将多个目标文件和库文件组合在一起,生成可执行文件。链接器的主要任务是解析符号引用,将目标文件中的符号与库中的符号进行匹配,并生成最终的可执行文件。

主要任务:
  • 符号解析:解析目标文件中的符号引用,确保所有符号都能正确解析。

  • 地址分配:为每个目标文件分配内存地址,生成最终的可执行文件。

  • 生成可执行文件:将所有目标文件和库文件合并为一个可执行文件,通常以 .exe(Windows)或无扩展名(Linux)为扩展名。

6. 运行(Execution)

生成的可执行文件可以被操作系统加载并运行。操作系统会为程序分配内存,加载可执行文件中的代码和数据,并启动程序的执行。

主要任务:
  • 加载可执行文件:将可执行文件中的代码和数据加载到内存中。

  • 初始化运行时环境:设置程序的运行时环境,如堆栈、堆等。

  • 执行程序:开始执行程序的主函数(main)。

示例

假设我们有一个简单的 C++ 程序 main.cpp

cpp复制

#include <iostream>int main() {std::cout << "Hello, World!" << std::endl;return 0;
}
1. 编写代码

将上述代码保存为 main.cpp

2. 预处理

使用 GCC 的预处理工具:

bash复制

g++ -E main.cpp -o main.i

生成的 main.i 文件包含了预处理后的代码。

3. 编译

将预处理后的文件编译为汇编代码:

bash复制

g++ -S main.i -o main.s

生成的 main.s 文件包含了汇编语言代码。

4. 汇编

将汇编代码转换为目标文件:

bash复制

g++ -c main.s -o main.o

生成的 main.o 文件包含了目标代码。

5. 链接

将目标文件链接为可执行文件:

bash复制

g++ main.o -o main

生成的 main 文件是一个可执行文件。

6. 运行

运行可执行文件:

bash复制

./main

输出:

Hello, World!

总结

从编写 C++ 文件到执行程序,整个过程包括预处理、编译、汇编、链接和运行。每个阶段都有其特定的任务和输出,最终生成可执行文件并运行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/75830.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PROE 与 STL 格式转换:开启 3D 打印及多元应用的大门

在 3D 设计与制造的复杂生态中&#xff0c;将 PROE 格式转换为 STL 格式绝非无端之举&#xff0c;而是有着深厚且多元的现实需求作为支撑。 一、文件格式介绍​ &#xff08;一&#xff09;PROE 格式​ PROE 作为一款参数化设计软件&#xff0c;采用基于特征的参数化建模技术…

开发中后端返回下划线数据,要不要统一转驼峰?

先说结论。看情况&#xff01;&#xff01;&#xff01;&#xff01; 前端 主要用 JS/TS 建议后端返回 camelCase&#xff0c;减少前端转换成本。后端 主要是 Python/Go 建议保持 snake_case&#xff0c;前端做转换。但是团队统一风格最重要&#xff01;如果统一返回驼峰就驼峰…

docker pull时报错:https://registry-1.docker.io/v2/

原文&#xff1a;https://www.cnblogs.com/sdgtxuyong/p/18647915 https://www.cnblogs.com/OneSeting/p/18532166 docker 换源&#xff0c;解决连接不上的问题。 编辑以下文件&#xff0c;不存在则创建&#xff1a; vim /etc/docker/daemon.json {"registry-mirrors&qu…

Pytorch学习笔记(十二)Learning PyTorch - NLP from Scratch

这篇博客瞄准的是 pytorch 官方教程中 Learning PyTorch 章节的 NLP from Scratch 部分。 官网链接&#xff1a;https://pytorch.org/tutorials/intermediate/nlp_from_scratch_index.html 完整网盘链接: https://pan.baidu.com/s/1L9PVZ-KRDGVER-AJnXOvlQ?pwdaa2m 提取码: …

基础算法02——冒泡排序(Bubble Sort)

冒泡排序&#xff08;Bubble Sort&#xff09; 冒泡排序&#xff1a;是一种简单的排序算法&#xff0c;其基本思想是通过重复遍历要排序的列表&#xff0c;比较相邻的元素&#xff0c;并在必要时&#xff08;即前面的数比后面的数大的时候&#xff09;交换它们的位置&#xff…

RestTemplate远程调用接口方式

1.Post(body空参) 也就是说需要给一个空的json 代码: String getDeviceUrl this.MOVABLE_URL "detected-data/getMachineLists"; // 远程调用 RestTemplate restTemplate new RestTemplate(); restTemplate.getMessageConverters().set(1,new StringHttpMessageC…

ar头显和眼镜图像特效处理

使用一个线程从摄像头或者其他设备循环读取图像数据写入链表&#xff0c;另一个线程从链表循环读取数据并做相应的特效处理&#xff0c;由于写入的速度比读取的快&#xff0c;最终必然会因为写入过快导致线程读写一帧而引发冲突和数据帧正常数据帧被覆盖。最好使用共享内存&…

mysql--socket报错

错误原因分析 MySQL 服务未运行&#xff08;最常见原因&#xff09; 错误中的 (2) 表示 “No such file or directory”&#xff0c;即 /tmp/mysql.sock 不存在这通常意味着 MySQL 服务器根本没有启动 socket 文件路径不匹配 客户端尝试连接 /tmp/mysql.sock但 MySQL 服务器可…

labview加载matlab数据时报错提示:对象引用句柄无效。

1. labview报错提示 labview加载mat数据时报错提示&#xff1a;对象引用句柄无效。返回该引用句柄的节点可能遇到错误&#xff0c;并没有返回有效的引用句柄。该引用句柄所指的存储可能在执行调用之前已关闭。报错提示如下&#xff1a; 这是由于labview缺少matlab MathWorks导…

面试计算机操作系统解析(一中)

判断 1. 一般来说&#xff0c;先进先出页面置换算法比最近最少使用页面置换算法有较少的缺页率。&#xff08;✘&#xff09; 正确答案&#xff1a;错误解释&#xff1a;FIFO&#xff08;先进先出&#xff09;页面置换算法可能导致“Belady异常”&#xff0c;即页面数增加反而…

如何防御TCP洪泛攻击

TCP洪泛攻击&#xff08;TCP Flood Attack&#xff09;是一种常见的分布式拒绝服务&#xff08;DDoS&#xff09;攻击手段&#xff0c;以下是其原理、攻击方式和危害的详细介绍&#xff1a; 定义与原理 TCP洪泛攻击利用了TCP协议的三次握手过程。在正常的TCP连接建立过程中&a…

20250330 Pyflink with Paimon

1. 数据湖 2. 本地安装Pyflink和Paimon 必须安装Python 3.11 Pip install python -m pip install apache-flink1.20.1 需要手动加入这两个jar 测试代码&#xff1a; import argparse import logging import sys import timefrom pyflink.common import Row from pyflink.tab…

-PHP 应用SQL 盲注布尔回显延时判断报错处理增删改查方式

#PHP-MYSQL-SQL 操作 - 增删改查 1 、功能&#xff1a;数据查询(对数据感兴趣&#xff09; 查询&#xff1a; SELECT * FROM news where id$id 2 、功能&#xff1a;新增用户&#xff0c;添加新闻等&#xff08;对操作的结果感兴趣&#xff09; 增加&#xff1a; INSERT INT…

【学习记录】大模型微调之使用 LLaMA-Factory 微调 Qwen系列大模型,可以用自己的数据训练

一、LoRA微调的基本原理 1、基本概念 LoRA&#xff08;Low-Rank Adaptation&#xff09;是一种用于大模型微调的技术&#xff0c;通过引入低秩矩阵来减少微调时的参数量。在预训练的模型中&#xff0c;LoRA通过添加两个小矩阵B和A来近似原始的大矩阵ΔW&#xff0c;从而减少需…

Vue 使用 xlsx 插件导出 excel 文件

安装与引入 安装 npm install xlsx npm install file-saver # 或者 yarn add xlsx yarn add file-saver 引入 import * as XLSX from xlsx; import FileSaver from file-saver 基本功能 读取 Excel 文件 // 读取文件内容 const workbook XLSX.readFile(path/to/file.xl…

vulntarget_a 训练笔记

win 7 权限 利用任意文件上传 getshell POST /module/ueditor/php/action_upload.php?actionuploadfile HTTP/1.1 User-Agent: Mozilla/5.0 (compatible; Baiduspider/2.0; http://www.baidu.com/search/spider.html) Accept: */* Accept-Language: zh-CN,zh;q0.9 Connectio…

无人机螺旋桨平衡标准

螺旋桨平衡是确保无人机(UAV)平稳运行、可靠性和使用寿命的关键过程。螺旋桨的不平衡会导致振动、噪音&#xff0c;并加速关键部件的磨损&#xff0c;从而对飞行性能产生负面影响。 ISO 21940-11:2016标准为旋翼平衡提供了一个广泛引用的框架&#xff0c;定义了可接受的不平衡…

既生瑜何生亮?Nginx RTMP 模块与 SRS RTMP服务器技术对比

在实时视频流的场景中&#xff0c;RTMP 协议作为一种传统且高效的流媒体传输协议&#xff0c;广泛应用于各类直播和点播系统。两款流行的开源 RTMP 服务器分别是基于 Nginx 的 Nginx RTMP 模块 和 SRS&#xff08;Simple Real-Time Server&#xff09;。这两者都在流媒体行业有…

MATLAB 批量移动 TIF 文件至分类文件夹

文章目录 前言一、步骤二、代码 前言 本代码用于从指定的源文件夹 (sourceFolder) 中筛选所有 .tif 文件&#xff0c;并根据文件名的特定关键词&#xff08;Daynight 和 FDI&#xff09;将其分类移动到相应的目标文件夹 (targetDaynightFolder 和 targetFDIFolder)。 一、步骤…

重温Ubuntu 24.04 LTS

用户调整 # 创建新用户 sudo adduser newusername # 设置新用户的密码 sudo passwd newusername # 将新用户添加到 sudo 组 sudo usermod -aG sudo newusername # 修改ssh访问权限 sudo nano /etc/ssh/sshd_config # 将新用户加入&#xff0c;此时root将无法访问 AllowUsers n…