编译链接与构建

8 篇文章

查看专题概览 / 复习建议

核心问题

  • 一段 C++ 代码从源文件到可执行文件经历了什么
  • 头文件、声明、定义、符号解析的关系是什么
  • 静态库和动态库在构建和运行时有什么差别
  • ODR 和 inline 为什么经常一起被问
  • 分离编译的优势和代价
  • 模板的编译模型
  • 构建系统和依赖管理
  • 交叉编译和工具链选择

建议复习顺序

  1. 预处理、编译、汇编、链接(编译到链接流程)
  2. 头文件组织(头文件保护与#pragma once)
  3. 声明、定义与符号(ODR与inline)
  4. 模板编译模型(模板与头文件)
  5. 静态库与动态库(库的选择和使用)
  6. ABI 与符号可见性
  7. 静态初始化顺序问题
  8. 构建系统和工程实践(CMake 基础)

子主题导航

高频追问

  • 为什么头文件通常只放声明
  • 什么情况下会出现重复定义
  • 动态库为什么会有加载时依赖问题
  • inline 为什么不仅仅是性能优化建议
  • 模板为什么要在头文件中定义
  • #pragma once 和 include guard 怎么选
  • 什么叫 ABI 不兼容
  • 全局对象初始化顺序为什么危险
  • 如何避免ODR违规
  • 静态链接和动态链接的取舍

易错点

  • 把编译和链接混成一个阶段
  • 认为 inline 只是内联展开
  • 讲库区别时只说体积,不说装载和更新特性
  • 不理解分离编译的机制
  • 忽略ABI兼容性问题
  • 低估头文件污染和静态初始化顺序带来的工程问题
  • 混淆声明和定义

学习策略

记忆技巧

编译链接四阶段

  • 预处理 = “展开头文件和宏”
  • 编译 = “源码变汇编”
  • 汇编 = “汇编变机器码”
  • 链接 = “符号解析+重定位”

库的选择口诀

  • 静态库 = “编译时拷贝,独立部署”
  • 动态库 = “运行时加载,便于共享”

关联学习

编译链接与前面的知识紧密相关:

  1. 模板与泛型:模板实例化模型
  2. 语言基础:声明vs定义、作用域
  3. 内存管理:动态库的加载和卸载
  4. 对象模型:符号导出和链接

理解编译链接需要结合语言特性和工程实践。