首页 > 后端开发 > C++ > 正文

c++编译和链接的过程是怎样的_c++程序从源码到可执行文件【原理】

裘德小鎮的故事
发布: 2025-12-15 16:48:06
原创
481人浏览过
c++kquote>C++程序从源代码到可执行文件需经预处理、编译和链接三阶段:预处理展开宏与头文件生成.ii文件;编译生成目标文件.o,含未定义符号;链接解析符号、重定位地址、合并段,生成最终可执行文件。

c++编译和链接的过程是怎样的_c++程序从源码到可执行文件【原理】

一个C++程序从写好源代码到变成能双击运行的可执行文件,中间要经过编译(Compilation)链接(Linking)两个核心阶段。它们不是一步完成的,而是分工明确、层层递进的过程。

预处理:先“展开”所有宏和头文件

编译器第一步不是直接翻译C++语法,而是调用预处理器(如cpp)。它负责处理以#开头的指令:

  • #include iostream> → 把iostream头文件的全部内容原样插入到当前源文件中
  • #define MAX 100 → 把后续所有出现的MAX替换成100
  • #ifdef DEBUG → 根据是否定义了DEBUG,决定保留或删掉某段代码

这一步不检查语法,只做纯文本替换,输出的是一个“.ii”后缀的“已展开”源文件(比如main.ii),为真正编译做好准备。

编译:把C++代码翻译成汇编,再转成机器码(目标文件)

预处理后的文件交给编译器(如g++的前端),完成三件事:

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

ChatCut
ChatCut

AI视频剪辑工具

ChatCut 1086
查看详情 ChatCut
  • 词法分析和语法分析:确认代码符合C++语法规则,构建抽象语法树(AST)
  • 语义分析:检查类型是否匹配、函数是否声明、变量是否定义等逻辑问题(比如int x = "hello";会在这里报错)
  • 代码生成:把AST翻译成对应平台的汇编代码(如x86-64),再由汇编器转成二进制的目标文件(.o.obj

注意:每个.cpp文件独立编译,生成一个对应的目标文件。此时函数调用(比如std::cout )还只是“占个位置”,因为实际实现不在本文件里——它被标记为“未定义符号”,留待链接阶段解决。

链接:把多个目标文件和库“拼起来”,填上所有地址

链接器(如ld或gold)把所有.o文件、系统库(如libstdc++.a)、动态库(如libc.so)整合成一个完整可执行文件。它主要做三件事:

  • 符号解析:找到每个“未定义符号”的定义位置(比如std::cout在libstdc++.a里,main在main.o里)
  • 重定位:各目标文件的代码和数据原本假设从地址0开始,链接器给它们分配真实内存地址,并修正所有跳转、调用、变量访问的地址(比如把call printf@PLT指向正确的PLT表入口)
  • 合并段:把所有.text(代码)段合在一起,所有.data(已初始化全局变量)段合在一起,形成最终文件结构

静态链接时,库代码直接复制进可执行文件;动态链接时,只记录依赖关系,运行时由操作系统加载共享库。

小结:整个流程是流水线式的,每步输出是下一步输入

源文件(.cpp)→ 预处理 → .ii → 编译+汇编 → .o → 链接 → 可执行文件(如a.out或.exe)
其中任何一个环节出错(语法错、找不到函数定义、重复定义、库缺失),都会中断流程,不会生成最终结果。
理解这个过程,对排查编译错误、控制构建行为(比如用-c只编译不链接)、优化链接速度(如使用lto)都很有帮助。

基本上就这些。

以上就是c++++编译和链接的过程是怎样的_c++程序从源码到可执行文件【原理】的详细内容,更多请关注php中文网其它相关文章!

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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