C/C++程序从编译到链接的过程

预处理阶段

预处理阶段处理所有以#开头的指令,包括宏定义、条件编译和头文件包含。该阶段生成.i文件,仍是文本格式但已完成宏展开。

头文件内容会被直接插入源文件位置,注释会被完全删除。条件编译指令会根据宏定义决定代码块是否保留。

编译阶段

编译器将预处理后的代码转换为汇编语言,生成.s文件。该过程包含词法分析、语法检查、语义分析和代码优化。

现代编译器会进行常量折叠、死代码消除等优化。例如int a=1+2可能被优化为int a=3。

汇编阶段

汇编器将汇编代码转换为机器码,生成.o目标文件。此时代码已是二进制格式,但函数地址和外部引用尚未解析。

目标文件包含代码段、数据段和符号表等信息,为链接阶段做准备。

链接阶段

链接器合并多个目标文件并解析符号引用,主要完成两项工作:

  • 符号解析:查找函数和变量的实际定义地址
  • 重定位:调整代码中的相对地址引用

静态链接会将库代码直接嵌入可执行文件,动态链接则在运行时加载共享库。

常用编译命令

查看预处理结果:

bash 复制代码
g++ -E main.cpp -o main.i

生成汇编代码:

bash 复制代码
g++ -S main.cpp

生成目标文件:

bash 复制代码
g++ -c main.cpp

完整编译流程:

bash 复制代码
g++ main.cpp -o app

理解编译流程有助于解决符号冲突、链接错误等问题,是进行性能优化和底层开发的基础。

相关推荐
Hello.Reader15 分钟前
tsrs 技术解析用 Rust 移植 TypeScript 7,类型检查还能怎样提速?
开发语言·rust·typescript
透明的玻璃杯31 分钟前
VS2015+QT 多线程
开发语言·qt
码匠许师傅1 小时前
【C++三方组件】mbedTLS:面向嵌入式的轻量 TLS
开发语言·c++
迪菲赫尔曼1 小时前
【基础篇 12】把环境与源码接起来:检查 GPU,再安装服务器上的项目
运维·服务器·开发语言·人工智能·python·yolo·目标检测
?re?ta?rd?ed?1 小时前
C++11新特性,{}与左值
c++·windows
2601_962885721 小时前
2026 Python 股票数据接口选型指南(横评 + 决策树)
开发语言·python·区块链
j7~2 小时前
【穷举、深搜与回溯算法】一棵决策树讲透全排列与子集
数据结构·c++·算法·leetcode·回溯·递归
Evand J2 小时前
【PMSM例程4】PMSM电阻辨识与模型补偿EKF,MATLAB例程。附下载链接,包运行成功
开发语言·matlab·电机·ekf·卡尔曼·pmsm
王仔小奶2 小时前
Rust 正在接管金融圈?深度拆解一份高薪 FinTech 岗位 JD
开发语言·金融·rust
小王C语言2 小时前
Qt常用控件:多元素控件,纵向列表,表格控件,树状控件
开发语言·qt