0

0

c++的编译和链接过程是怎样的_从源码到可执行文件的编译流程详解

穿越時空

穿越時空

发布时间:2025-11-01 13:47:34

|

174人浏览过

|

来源于php中文网

原创

C++程序生成需经历预处理、编译、汇编和链接四阶段:1. 预处理器展开头文件、宏替换并生成.i文件;2. 编译器将.i文件翻译为.s汇编代码;3. 汇编器转为.o目标文件;4. 链接器合并目标文件与库,生成可执行程序。

c++的编译和链接过程是怎样的_从源码到可执行文件的编译流程详解

C++ 程序从源代码变成可执行文件,要经历四个主要阶段:预处理、编译、汇编和链接。每个阶段都有明确的任务,最终生成可以在操作系统上运行的程序。下面详细说明这一流程。

1. 预处理(Preprocessing)

预处理阶段处理源代码中以 # 开头的指令,比如 #include#define#ifdef 等。这个阶段由预处理器完成,不进行语法检查,只是对源文件做文本替换和展开。

常见操作包括:

  • 将头文件内容插入到 #include 指令的位置
  • 展开宏定义(#define
  • 根据条件编译指令决定保留或删除某段代码(如 #ifdef
  • 删除注释

输出结果是一个扩展后的源代码文件,通常以 .i 为后缀(例如 main.i)。你可以使用以下命令单独执行预处理:

立即学习C++免费学习笔记(深入)”;

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

2. 编译(Compilation)

编译器将预处理后的 C++ 代码转换成汇编语言。这个阶段会进行词法分析、语法分析、语义分析和优化,最终生成与目标平台相关的汇编代码。

任务包括:

  • 检查语法和类型是否正确
  • 将高级语言结构翻译为低级的中间表示
  • 进行代码优化(如常量折叠、死代码消除等)
  • 输出汇编代码文件(通常以 .s 为后缀)

使用以下命令可以只执行编译阶段:

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

3. 汇编(Assembly)

汇编器将汇编代码(.s 文件)翻译成机器能直接识别的二进制代码,也就是目标文件(Object File)。目标文件包含机器指令、数据、符号表和重定位信息,但还不能直接运行,因为可能依赖其他模块中的函数或变量。

Python精要参考 pdf版
Python精要参考 pdf版

这本书给出了一份关于python这门优美语言的精要的参考。作者通过一个完整而清晰的入门指引将你带入python的乐园,随后在语法、类型和对象、运算符与表达式、控制流函数与函数编程、类及面向对象编程、模块和包、输入输出、执行环境等多方面给出了详尽的讲解。如果你想加入 python的世界,David M beazley的这本书可不要错过哦。 (封面是最新英文版的,中文版貌似只译到第二版)

下载

目标文件通常是 ELF(Linux)或 COFF(Windows)格式,扩展名一般为 .o(Linux)或 .obj(Windows)。

执行汇编的命令:

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

也可以直接从源码一步生成目标文件:

g++ -c main.cpp -o main.o

4. 链接(Linking)

链接器负责将一个或多个目标文件以及所需的库文件合并成一个可执行文件。它解决函数和变量的跨文件引用问题,完成符号解析和地址重定位。

主要工作有:

  • 合并所有目标文件的代码段和数据段
  • 解析外部符号(如调用 printf 时需要找到其定义)
  • 处理静态库和动态库的依赖
  • 生成最终的可执行文件(如 a.out 或自定义名称)

简单链接命令:

g++ main.o utils.o -o program

如果程序使用了标准库或其他第三方库,链接器会自动链接标准库(如 libc++),也可以手动指定库路径和库名:

g++ main.o -L/path/to/lib -lmylib -o program

基本上就这些。整个过程看似复杂,但现代构建系统(如 Make、CMake)会自动管理这些步骤。理解底层流程有助于排查编译错误、链接冲突或性能问题。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1502

2023.10.24

typedef和define区别
typedef和define区别

typedef和define区别在类型检查、作用范围、可读性、错误处理和内存占用等。本专题为大家提供typedef和define相关的文章、下载、课程内容,供大家免费下载体验。

109

2023.09.26

define的用法
define的用法

define用法:1、定义常量;2、定义函数宏:3、定义条件编译;4、定义多行宏。更多关于define的用法的内容,大家可以阅读本专题下的文章。

338

2023.10.11

printf用法大全
printf用法大全

php中文网为大家提供printf用法大全,以及其他printf函数的相关文章、相关下载资源以及各种相关课程,供大家免费下载体验。

75

2023.06.20

fprintf和printf的区别
fprintf和printf的区别

fprintf和printf的区别在于输出的目标不同,printf输出到标准输出流,而fprintf输出到指定的文件流。根据需要选择合适的函数来进行输出操作。更多关于fprintf和printf的相关文章详情请看本专题下面的文章。php中文网欢迎大家前来学习。

286

2023.11.28

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

784

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1129

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

803

2023.08.01

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

1

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 8万人学习

Git 教程
Git 教程

共21课时 | 3.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号