
静态库与动态库原理,编译流程详解
编译流程
1、预处理(Preprocessing)
完成宏替换、文件引入,以及去除空行、注释等,为下一步的编译做准备。
$ gcc -E test.c -o test.i -E让gcc在预处理结束后停止编译,test.i 为预处理后的输出文件。-o:指定输出文件。
也就是对各种预处理命令进行处理,包括头文件的包含、宏定义的扩展、条件编译的选择等
2、编译(Compilation)
将预处理后的代码编译成汇编代码。在这个阶段中,首先要检查代码的规范性,是否有语法错误等,以确定代码实际要做的工作,在检查无误后,再把代码翻译成汇编语言。
$ gcc -S test.i -o test.s -S让gcc在编译结束后停止编译过程,test.s文件为编译后生成的汇编代码。
大多数的编译程序直接产生机器语言的目标代码,形成可执行的目标文件,也有的是先产生灰白你语言一级的符号代码文件,在调用汇编程序进行翻译和加工处理,最后产生可执行的机器语言目标文件。
编译程序执行时,先分析,后综合。分析,就是指词法分析,语法分析,语义分析和中间代码生成。综合,就是指代码优化和代码生成。
3、汇编(Assemble)
汇编就是把编译阶段生成的“.s”文件转成二进制的目标代码,也就是机器代码(01序列)
$ gcc -c test.s -o test.o -c让gcc在汇编结束后停止编译过程,“test.o”文件为汇编后生成的机器代码文件。
4、链接(Linking)
链接就是将多个目标文件及所需的库文件链接生成可执行的目标文件的过程。
$ ./test
$ gcc test.o -o test
hello World!
-o本质上是一个重命名选项。不使用-o选项时,默认生成的时a.out文件。这里生成的时可执行文件test。
静态库实际就是一些目标文件(一般.o结尾)的集合,静态库一般以.a结尾,只用与生成可执行文件阶段。
在连接步骤中,链接器将从库文件取得所需代码,复制到生成的可执行文件中。这种库称为静态库。其特点是可执行文件中包含了库代码的一份完整拷贝,在编译过程中被载入程序中。缺点就是多次使用就会有多份冗余拷贝,并且对程序的更新、部署和发布会带来麻烦,如果静态库有更新,那么所有使用它的程序都需要重新编译、发布。
首先生成目标文件 (.o文件),使用ar命令将目标文件打包成静态库 ($ ar rcs libtest.a test.o)使用ar t libtest.a 查看静态库内容
在链接阶段没有被复制到程序中,而是在程序运行时由系统动态加载到内存中供程序调用。
系统只需载入一次动态库,不同的程序可以得到内存中相同动态库的副本,因此节省了很多内存。
首先生成目标文件 使用-fPIC和-shared生成动态库($ gcc -shared -fPIC -o libtest.so test.o)
载入时刻不同
静态库在程序编译时会链接到目标代码中,程序运行时不再需要静态库,因此体积较大。而且每次编译都需要载入静态代码,因此内存开销大。
动态库在程序编译时不会被链接到目标代码中,而是在程序运行时才被载入,程序运行时需要动态库存在,因此体积较小。而且系统只需载入一次动态库,不同程序可以得到内存中相同的动态副本,因此内存开销小。
作者:紫雾凌寒
来源:CSDN

-
HarmonyOS单模块 编译 与 源码导读软通夏德旺 • 2.5w浏览 • 3回复
-
鸿蒙系统的 编译 流程 及分析v1.0liangkz_梁开祝 • 2.8w浏览 • 8回复
-
鸿蒙 动态 权限申请完整规范 流程 和操作 详解软通夏德旺 • 3.9w浏览 • 5回复
-
OpenHarmony-2.0-Canary 编译 构建 流程丨张明亮丨 • 1.5w浏览 • 1回复
-
如何使用分布式数据 库 方法 详解奶盖 • 1.1w浏览 • 0回复
-
HarmonyOS 数据 库 系列之对象关系映射数据 库深开鸿开发板 • 9685浏览 • 7回复
-
HarmonyOS 数据 库 系列之关系型数据 库深开鸿开发板 • 1.3w浏览 • 8回复
-
OpenHarmony 2.0 Canary 标准系统的 编译 流程liangkz_梁开祝 • 1.2w浏览 • 5回复
-
OpenHarmony 2.0 Canary Linux Kernel 的 编译 流程liangkz_梁开祝 • 1.5w浏览 • 3回复
-
鸿蒙应用开发:如何 与 组件 库 (Glide)衔接?即构忠武 • 1.5w浏览 • 16回复
-
#星光计划2.0# OpenHarmony SA 动态 库 服务 拉起的main入口碼磚民工 • 1.6w浏览 • 1回复
-
#星光计划2.0# OpenHarmony 如何使用闭源 动态 库碼磚民工 • 1.2w浏览 • 3回复
-
移植案例 与 原理 - build lite 编译 构建过程zhushangyuan_ • 9207浏览 • 2回复
-
openharmony L1级 动态 库 编译 使用挖墙脚的农民工 • 9231浏览 • 2回复
-
SQLServer创建数据 库 详解tomcatf149999 • 1940浏览 • 0回复
-
OHOS3.1 简明 编译 流程liangkz_梁开祝 • 9396浏览 • 1回复
-
#云原生征文#数据 库 设计 与 开发三大规范解读执数浪天涯 • 9014浏览 • 1回复
-
#夏日挑战赛# 数据 库 发展的前世 与 今生百思不得小赵 • 3572浏览 • 6回复
-
#夏日挑战赛#交叉 编译 (一)-- musl 库 浅析挖墙脚的农民工 • 8276浏览 • 3回复
- 天梭腾智无界系列腕表上市,内置部分华为鸿蒙功能 2021-04-14 13:47:14发布
- 谷歌发布 Android系统2021年4月安全更新,开始为 Pixel手机推送 2021-04-06 11:12:37发布