⚡
编译链接与构建
8 篇文章
查看专题概览 / 复习建议
核心问题
- 一段 C++ 代码从源文件到可执行文件经历了什么
- 头文件、声明、定义、符号解析的关系是什么
- 静态库和动态库在构建和运行时有什么差别
- ODR 和
inline为什么经常一起被问 - 分离编译的优势和代价
- 模板的编译模型
- 构建系统和依赖管理
- 交叉编译和工具链选择
建议复习顺序
- 预处理、编译、汇编、链接(编译到链接流程)
- 头文件组织(头文件保护与#pragma once)
- 声明、定义与符号(ODR与inline)
- 模板编译模型(模板与头文件)
- 静态库与动态库(库的选择和使用)
- ABI 与符号可见性
- 静态初始化顺序问题
- 构建系统和工程实践(CMake 基础)
子主题导航
- 编译到链接流程.md
- 静态库与动态库.md
- ODR与inline.md
- [头文件保护与#pragma once.md](头文件保护与#pragma once.md)
- 模板与头文件.md
- ABI与符号可见性.md
- 静态初始化顺序问题.md
- CMake基础.md
高频追问
- 为什么头文件通常只放声明
- 什么情况下会出现重复定义
- 动态库为什么会有加载时依赖问题
inline为什么不仅仅是性能优化建议- 模板为什么要在头文件中定义
#pragma once和 include guard 怎么选- 什么叫 ABI 不兼容
- 全局对象初始化顺序为什么危险
- 如何避免ODR违规
- 静态链接和动态链接的取舍
易错点
- 把编译和链接混成一个阶段
- 认为
inline只是内联展开 - 讲库区别时只说体积,不说装载和更新特性
- 不理解分离编译的机制
- 忽略ABI兼容性问题
- 低估头文件污染和静态初始化顺序带来的工程问题
- 混淆声明和定义
学习策略
记忆技巧
编译链接四阶段:
- 预处理 = “展开头文件和宏”
- 编译 = “源码变汇编”
- 汇编 = “汇编变机器码”
- 链接 = “符号解析+重定位”
库的选择口诀:
- 静态库 = “编译时拷贝,独立部署”
- 动态库 = “运行时加载,便于共享”
关联学习
编译链接与前面的知识紧密相关:
- 模板与泛型:模板实例化模型
- 语言基础:声明vs定义、作用域
- 内存管理:动态库的加载和卸载
- 对象模型:符号导出和链接
理解编译链接需要结合语言特性和工程实践。