C++ 编译、链接、静态链接库、动态链接库原理总结

C++ 编译链接

简单说下总体流程:读取源程序——预处理——编译——汇编——链接
在这里插入图片描述

  • 预处理器先处理各种宏定义,然后交给编译器;
  • 编译器编译成.s为后缀的汇编代码;
  • 汇编代码再通过汇编器形成.obj/.o机器码(二进制);
  • 最后通过链接器将一个个目标文件(库文件/.obj/.o)链接成一个完整的可执行程序(或者静态库、动态库)。

1.1 预处理

预处理阶段:

  • 宏#define。将所有的#define删除并展开所有的宏。
  • 条件编译指令,如#ifdef,#ifndef,#else,#elif,#endif等。
  • 头文件包含,#include。将包含的文件插入到预编译的文件中
  • 过滤所有的注释符号。
  • 添加行号和文件标识。方便再编译器产生调试用的行号信息等。
  • 特殊符号(不必深究什么符号)

1.2 编译

1.2.1 预编译

  • 编译程序所要作得工作就是通过词法分析和语法分析,在确认所有的指令都符合语法规则之后,将其翻译成等价的汇编语言

1.2.2 优化

  • 优化一部分是对中间代码的优化。这种优化不依赖于具体的计算机。主要的工作是删除公共表达式、循环优化(代码外提、强度削弱、变换循环控制条件、已知量的合并等)、复写传播,以及无用赋值的删除等。
  • 另一种优化则主要针对目标代码的生成而进行的。同机器的硬件结构密切相关,最主要的是考虑是如何充分利用机器的各个硬件寄存器存放的有关变量的值,以减少对于内存的访问次数。另外,如何根据机器硬件执行指令的特点(如流水线、RISC、CISC、VLIW等)而对指令进行一些调整使目标代码比较短,执行的效率比较高。

1.3 汇编

  • 把汇编语言代码翻译成目标机器指令生成目标文件(.o/.obj文件,都是二进制文件)。此过程会依赖机器的硬件和操作系统环境。
  • .o文件至少需要提供三张表
    • 导出符号表: 即该目标文件可以提供的符号及地址
    • 未解决符号表:即找不到地址的符号的列表,告诉链接器这些符号没找
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值