新闻中心

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

2025-12-15
浏览次数:
返回列表
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++语法规则,构建抽象语法树(AST)
  • 语义分析:检查类型是否匹配、函数是否声明、变量是否定义等逻辑问题(比如int x = "hello";会在这里报错)
  • 代码生成:把AST翻译成对应平台的汇编代码(如x86-64),再由汇编器转成二进制的目标文件(.o.obj

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

AI Code Reviewer AI Code Reviewer

AI自动审核代码

AI Code Reviewer 112 查看详情 AI Code Reviewer

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

链接器(如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++程序从源码到可执行文件【原理】的详细内容,更多请关注其它相关文章!


# 多线程  # 确山seo网络推广营销  # 和平区网站建设维护招聘  # 乘风网站推广系统 v3.9  # 手机seo方案  # seo框架使用教程交流  # 知识推广营销  # 小米网络营销方案推广  # 怎么申请做网站推广  # 成品网站建设方案范文模板  # PC网站建设路小吃  # 翻译成  # 源代码  # 转成  # 前端  # 如何使用  # 全局变量  # 头文件  # 是怎样  # 可执行文件  # 编译错误  # stream  # ios  # c++  # ai  # 处理器  # 操作系统  # go 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: Go语言中高效处理x-www-form-urlencoded表单数据  Go语言中JSON数据解码与字段访问指南  顺丰快件物流信息 官方网站查询入口  斑马英语APP如何开启夜间护眼阅读_斑马英语APP夜间模式与低蓝光设置教程  QQ邮箱在线使用入口 QQ邮箱个人账号网页版登录  怎么在html里运行vbs脚本_html中运行vbs脚本方法【教程】  飞书妙记怎样用语音转文字速记_飞书妙记用语音转文字速记【速记方法】  《刺客信条:影》PS5 Pro和Switch 2画面对比  Composer中的^和~符号代表什么_精通Composer版本号语义化约束  天眼查怎么看公司融资情况 天眼查企业融资历史查询步骤【攻略】  Win11文件资源管理器卡顿怎么修 Win11重置资源管理器进程优化响应速度【修复方法】  Bing引擎入口最新2025 Bing搜索免费官方登录  Pandas DataFrame:高效添加条件计算列  Yandex搜索引擎一键访问入口_俄罗斯Yandex官网免登录  Go语言中动态执行代码字符串的策略与实践  照顾宝贝2小游戏点击立即在线玩  iwriter统一登录平台 iwrite账号密码登录页面  Fabric模组开发:自定义物品与物品组的现代管理方法  想当下一个《2077》?《心之眼》Steam评价升至"多半好评"  在J*a中如何开发在线活动报名与管理系统_活动报名管理项目实战解析  QQ邮箱登录首页官网地址2026 QQ邮箱官方网页入口  sublime怎么设置启动时打开的窗口_sublime会话管理与热退出  如何使用Go和Martini动态服务解码后的图片  微信网页版官方快速登录入口 微信网页版网页版账号直达  C++如何使用AddressSanitizer(ASan)_C++调试工具中检测内存访问错误的利器  神经网络二分类模型训练异常:高损失与完美验证准确率的排查与修正  优酷会员付费后没到账怎么办_优酷会员充值异常及解决方法  PDF文件体积过大处理_PDF压缩技巧详解  如何使用Rector自动化升级旧代码_通过Composer安装和配置Rector进行代码重构  Win11网速慢怎么解决 Win11网络设置优化解除限速  C++如何实现一个装饰器模式_C++设计模式之动态地给对象添加额外职责  铃兰之剑为这和平的世界希里技能组及加点推荐  MAC如何安全彻底地删除文件_MAC使用终端命令确保文件无法被恢复  mysql通配符支持数字匹配吗_mysql通配符能否用于数字匹配的解析  J*aScript中高效清空DOM列表元素:解决for循环中断与任务管理问题  b站赚钱渠道_b站收益来源  必由学网页版入口 必由学官方平台直接访问  腾讯QQ邮箱登录入口_QQ邮箱官方网站使用地址  抓大鹅无需下载版 抓大鹅秒玩版入口  css滚动动画效果怎么实现_使用Animate.css滚动触发动画类  解决Python logging 中 datefmt 导致时间戳固定不变的问题  MAC怎么在地图App里使用“四处看看”_MAC体验部分城市的3D实景街景  css子元素高度不一致导致布局错位怎么办_使用align-items:stretch解决高度差异  动漫岛观看全网网 动漫岛在线正版动漫入口  必由学官方平台入口 必由学在线课堂登录地址  拼多多赚钱渠道_拼多多收益来源  利用5118提升短视频内容效果_5118短视频关键词优化方法  AO3镜像入口大全 AO3网页版内容访问全集  俄罗斯浏览器官网直达链接 俄罗斯浏览器最新在线入口导航  steam官方网页快速访问 steam账号注册全流程 

搜索