源码 ——> 预处理器 .i 文件——> 编译器 .s 文件 ——> 汇编器 .o 文件 ——> 链接器 ——> 执行程序
预处理器:读取代码里 #开头的命令 ,并把他插入到程序文本里,生产已.i 为后缀名的文件
编译器:把.i 文件 生成汇编文件 .s
汇编器:把汇编文件 生成 二进制 文件 .a
链接器:链接其他的二进制 文件 生成 最终 执行程序
静态链接 和 动态链接
1.静态链接(在装载之前,完成所有符号的引用)
静态链接:链接器在链接阶段将各种库文件和相关文件集成到可执行文件中,在windows下静态链接库以.lib结尾,linux下以.a结尾
步骤:1,空间与地址的分配,扫描所有的目标文件,合并相似段,收集当中所有的符号信息,
2,符号解析与重定位,调整代码位置
优点:程序发布时无需带库,可以独立执行
缺点:1,浪费内存空间,多进程操作系统下,内存中可能会存在多个相同的库
2,程序开发受限,有一个模块更新,要重新编译打包整个代码
2.动态链接(在运行时才进行符号重定位)
动态链接:动态链接是把链接过程在运行时进行,动态链接在可执行文件装载或运行的时候,由操作系统的装载程序加载库文件,windows下以.dll结尾,也有.lib的,但是这个是叫做导入库,和静态链接的不一样,linux下以.so结尾。。
步骤:编译时通过记录一系列符号与参数,在程序运行或加载时将这些信息传给操作系统,操作系统将需要的动态库加载到内存中去,然后再程序运行到指定的代码时,去共享执行内存中已经加载的动
标签:文件,操作系统,静态,C++,编译,动态,过程,链接,加载 From: https://www.cnblogs.com/JOKER2255/p/18360240