尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

C++ : 编译链接流程

C++ : 编译链接流程 C++ 编译链接流程专题详解从一行.cpp源代码到最终能双击运行的可执行文件,中间经历了预处理、编译、汇编、链接四个阶段。理解这条流水线,不仅能解释很多"报错到底出在哪一步"的问题,也能彻底讲清楚static、const、extern这些关键字在不同阶段各自扮演的角色,以及静态库/动态库的本质区别。目录整体流程总览第一阶段:预处理(Preprocessing)第二阶段:编译(Compilation)第三阶段:汇编(Assembly)第四阶段:链接(Linking)声明 vs 定义,以及 ODR关键字在各阶段的角色对照静态库 vs 动态库常见坑高频面试题一、整体流程总览main.cpp 可执行文件 │ ▲ │ 预处理(Preprocessing) │ ▼ │ main.i (展开了宏、头文件的纯C++代码) │ │ │ │ 编译(Compilation) │ 链接(Linking) ▼ │ main.s (汇编代码,文本格式的CPU指令) main.o + 其他.o文件 + 库文件 │ ▲ │ 汇编(Assembly) │ ▼ │ main.o (目标文件,二进制机器码 + 符号表 + 重定位信息) ─────────────────┘四个阶段分别由不同的工具完成(以GCC/Clang为例):阶段工具输入输出预处理预处理器(cpp).cpp.i编译编译器(cc1).i.s汇编汇编器(as).s.o链接链接器(ld)多个.o+ 库文件可执行文件注意:日常开发中我们常说"编译一个项目",其实是把这四个步骤打包在一起的统称,g++ main.cpp -o main这一条命令背后依次调用了这四个独立的工具。可以用g++ -save-temps main.cpp保留每个中间阶段的产物,直观看到每一步到底发生了什么。二、第一阶段:预处理(Preprocessing)这是一个纯文本替换阶段,不理解任何C++语法,只处理以#开头的预处理指令。主要工作1. 头文件展开(#include)#include"decoder.h"预处理器会把这一行替换成decoder.h文件的完整内容,如果decoder.h里又#include了其他头文件,会递归展开,最终把所有依赖的头文件内容全部"平铺"进当前这一个巨大的临时文件里。2. 宏替换(#define)#defineMAX_SIZE100intarr[MAX_SIZE];// 预处理后变成 int arr[100];#defineSQUARE(x)((x)*(x))inty=SQUARE(5);// 预处理后变成 int y = ((5) * (5));3. 条件编译(#ifdef/#ifnde
返回列表