1、静态链接:
静态库在编译链接期间被打包copy到了可执行文件中
,也就是说静态库其实是在编译期间(Compile time)链接使用的。
2、动态链接:
2.1、load-time dynamic linking(加载时动态链接)
-
阶段一:链接时,将动态库信息写入可执行文件;
在编译链接
生成可执行文件阶段时需要告诉编译器所依赖的动态库信息
。
-
阶段二:加载时,可执行文件依据动态库信息进行动态链接。
当可执行文件加载(可执行文件复制到内存)完成后,在程序开始运行之前,操作系统就会查找可执行文件依赖的动态库信息,即依据第一阶段给的链接信息进行动态库的查找以及符号决议。
找到该动态库后就将该动态库从磁盘搬到内存,如果这个过程没有问题,那么程序开始运行。
2.2、run-time dynamic linking(运行时动态链接)
运行时动态链接
不需要在编译链接时提供动态库信息
,也就是说,
在可执行文件被启动运行之前,可执行文件对所依赖的动态库信息一无所知
,只有当程序运行到需要调用动态库所提供的代码时才会启动动态链接过程。
在动态链接下,可执行文件当中会新增两段,即dynamic段以及GOT(Global offset table)段,这两段内容就是是我们之前所说的动态库信息。 dynamic段中保存了可执行文件依赖哪些动态库,动态链接符号表的位置以及重定位表的位置等信息。
参考资料:
彻底理解链接器:三,库与可执行文件
3、数据段与代码段的内容:
-
代码段:
指的是计算机可以执行的机器指令,也就是源文件中定义的所有函数
。
-
数据段:源文件中定义的全局变量。
特例:局部变量是函数私有的,
所以函数私有的局部变量被放在了代码段中,作为机器指令的操作数
。
4、什么时候需要重新链接:
如果我们修改了动态库的代码,我们
只需要重新编译动态库就可以了而无需重新新编译我们自己的程序,因为可执行文件当中仅仅保留了动态库的必要信息,重新编译动态库后这些必要都信息是不会改变的(只要不修改动态库的名字和动态库导出的供可执行文件使用的函数),
编译好新的动态库后只需要简单的替换原有动态库,下一次运行程序时就可以使用新的动态库了。
参考链接:
编译链接全套学习资料
1、静态链接:静态库在编译链接期间被打包copy到了可执行文件中,也就是说静态库其实是在编译期间(Compile time)链接使用的。2、动态链接:2.1、load-time dynamic linking(加载时动态链接)阶段一:链接时,将动态库信息写入可执行文件;在编译链接生成可执行文件阶段时需要告诉编译器所依赖的动态库信息。阶段二:加载时,可执行文件依据动态库信息进行动态链接。当可执行文件加载(可执行文件复制到内存)完成后,在程序开始运行之前,操作系统就会查找可执行文件依赖的动态库信
开发中经常使用三方库去实现某特定功能,而这些三方库通常又分为开源库和闭源库。开源库可以直接拿到源码,和自己写的没有什么区别,我们可以最大程度的
修改
源码来适应自己功能。闭源库就是被
发布
者提前打包好的
静态
库或 Bundle 包,对此我们无法看到内部实现,对于其封装好的特定功能,我们也只
需要
调用其开放的API即可。
在正式的上
代码
之前,先
介绍
一些从网上搜集的
静态
库相关的基本概念,以加深对后面知识的理解
库实际上是一种
代码
共享的方式,主要用于
代码
重用和源码隐藏,通常分为
动态库
和
静态
库。
2. 区别
静态
库:
链接
时完整的拷贝至可执行文
件
中,被多次使用就有多份冗余拷贝。
动态库
:
链接
时不
《
链接
器和加载器》讲述构建程序的关键工具——
链接
器和加载器,内容包括
链接
和加载、体系结构、目标文
件
、存储分配、符号管理、库、重定位、加载和覆盖、共享库、
动态链接
和加载、
动态链接
的共享库,以及着眼于成熟的现代
链接
器所做的一些变化;并
介绍
一个持续的实践项目,即使用Perl语言开发一个可用的小
链接
器。
《
链接
器和加载器》适合高校计算机相关专业的学生、实习程序员、语言设计者和开发人员阅读参考。
《
链接
器和加载器》:不管你的编程语言是什么,不管你的平台是什么,你很可能总是会涉及
链接
器和加载器的功能。但是你知道如何最大限度地利用它们吗?只有现在,随着《
链接
器和加载器》的出版,总算有一本深入完整地彻底揭示编译时和运行时过程的权威著作了。
《
链接
器和加载器》首先通过实例深入浅出地阐述了在不同的编译器和操作系统中
链接
和加载过程的差异。在这个基础上,作者提出了清晰实用的忠告,来帮助你创建更快、更清晰的
代码
。你将会学习如何规避和Windows DLL相关的陷阱,充分利用UNIX ELF库模式等。如果你对程序设计抱有非常认真的态度,那么你可以通过这本书充分地理解这个领域内最难懂的主题之一。《
链接
器和加载器》对于编译器和操作系统课程同样也是一本理想的补充读物。
《
链接
器和加载器》特性
◆覆盖了Windows,UNIX,Linux,BeOS和其它操作系统的
动态链接
过程。
◆解释了Java
链接
模式,以及它是如何应用在网络小应用程序和可扩展Java
代码
中的。
◆帮助你编写更优雅、更高效的
代码
,以及构建能够被更加高效地编译、加裁和运行的应用程序。
◆包含了一个用Perl构建
链接
器的练习项目,项目文
件
可以从网络下载得到。
“我很享受阅读这本对实现
链接
器和加载器的众多技术和挑战进行有效概述的书。虽然书中的多数例子都集中在今天被广泛使用的三种计算机体系结构上,但这本书也包含了很多描述过去的一些有趣和古怪的计算机体系结构的注解。通过这些真实的战例,我断定作者本人真正经历了这些事情并存活了下来给我们讲述这个故事。”
——Guy Steele
作者:(美国)莱文(John R.Levine) 译者:李勇
莱文(John R.Levine),是很多书籍的作者或合作者,包括Lex & Yacc(O'Reilly),Programming for Graphics Files in C and C++(Wiley),以及7-heIntemetforDummies(IDG)。他还是Journal of C Language Translation的荣誉退休发行人、comp.compilers新闻组的长期仲裁人员,以及某个最早的商用Fortran 77编译器的创建考。他在耶鲁大学获得了计算机科学的博士学位。
第1章
链接
和加载
1.1
链接
器和加载器做什么?
1.2 地址绑定:从历史的角度
1.3
链接
与加载
1.4 编译器驱动
1.5
链接
:一个真实的例子
第2章 体系结构的问题
2.1 应用程序二进制接口
2.2 内存地址
2.3 地址构成
2.4 指令格式
2.5 过程调用和寻址能力
2.6 数据和指令引用
2.7 分页和虚拟内存
2.8 Intel 386分段
2.9 嵌入式体系结构
第3章 目标文
件
3.1 目标文
件
中都有什么?
3.2 空目标文
件
格式:MS-DOS的COM文
件
3.3
代码
区段:UNIX的a.out文
件
3.4 重定位:MS-DOS的EXE文
件
3.5 符号和重定位
3.6 可重定位的a.out格式
3.7 UNIX的ELF格式
3.8 IBM 360目标格式
3.9 微软可移植、可执行体格式
3.10 Intel/Microsoft的OMF文
件
格式
3.11 不同目标格式的比较
第4章 存储空间分配
4.1 段和地址
4.2 简单的存储布局
4.3 多种段类型
4.4 段与页面的对齐
4.5 公共块和其他特殊段
4.6
链接
器控制脚本
4.7 实际中的存储分配
第5章 符号管理
5.1 绑定和名字解析
5.2 符号表格式
5.3 名称
修改
5.4 弱外部符号和其他类型符号
5.5 维护调试信息
第6章 库
6.1 库的目的
6.2 库的格式
6.3 建立库文
件
6.4 搜索库文
件
6.5 性能问题
6.6 弱外部符号
第7章 重定位
7.1 硬
件
和软
件
重定位
7.2
链接
时重定位和加载时重定位
7.3 符号和段重定位
7.4 基本的重定位技术
7.5 可重
链接
和重定位的输出格式
7.6 其他重定位格式
7.7 特殊情况的重定位
第8章 加载和覆盖
8.1 基本加载
8.2 带重定位的基本加载
8.3 位置无关
代码
8.4 自举加载
8.5 树状结构的覆盖
第9章 共享库
9.1 绑定时间
9.2 实际的共享库
9.3 地址空间管理
9.4 共享库的结构
9.5 创建共享库
9.6 使用共享库
链接
9.7 使用共享库运行
9.8 malloc hack和其他共享库问题
第10章
动态链接
和加载
10.1 ELF
动态链接
10.2 ELF文
件
内容
10.3 加载一个
动态链接
程序
10.4 使用PLT的惰性过程
链接
10.5
动态链接
的其他特性
10.6 运行时的
动态链接
10.7 微软
动态链接
库
10.8 OSF/1伪
静态
共享库
10.9 让共享库快一些
10.10 几种
动态链接
方法的比较
第11章 高级技术
11.1 C++的技术
11.2 增量
链接
和
重新
链接
11.3
链接
时的垃圾收集
11.4
链接
时优化
11.5
链接
时
代码
生成
11.6 Java
链接
模型
几乎从有计算机以来,
链接
器和加栽器就是软
件
开发工具包中的一部分,因为它们允许使用模块(而不是一个单独的大文
件
)来构建程序的关键工具。
早在1947年,程序员们就开始使用原始的加载器:将程序的例程存储在多个不同的磁带上,并将它们合并、重定位为一个程序。在20世纪60年代早期,这些加栽器就已经发展得相当完善了。由于那时内存很贵且容量有限,计算机的速度很慢(以今天的标准),为了创建复杂的内存覆盖策略(以将大容量的程序加载到小容量内存中),以及
重新
编辑先前
链接
过的文
件
(以节省
重新
创建程序的时间),这些
链接
器都包含了很多复杂的特性。
20世纪七八十年代,
链接
技术几乎没有什么进展。
链接
器趋向于更加简单,虚拟内存技术将应用程序和覆盖机制中的大多数存储管理工作都转移给了操作系统,越来越快的计算机和越来越大的磁盘也使得
重新
链接
一个程序或替换个别模块比仅仅
链接
改变过的地方更加容易了。从20世纪90年代起,
链接
器又开始变得复杂起来,增加了诸多现代特性,包括对
动态链接
共享库的支持和对C++独特要求的支持。同时,像IA64那样具有宽指令字和编译时访存调度特性的先进处理器架构,也
需要
将一些新的特性加入到
链接
器中,以确保在被
链接
的程序中可以满足
代码
的这些复杂需求。
vue-lottie加载json动画为什么用怎么用1.安装2.引用3.引入动画json4.引入lottie插
件
5.添加属性和方法
针对目前页面的一些设计样式,为了达到一定的视觉效果,难免会有一些动态效果的情况,一般首先想到的是动图,gif或者apng 但是动态图的帧数越多 图片越大 加载也就会更慢。
于是就有一种将动画数据导出json的形式加载到页面中。优点诸多
1.文
件
非常小,通常以json加载到页面中,加载更快
2.可以前进,后退,是否循环播放动画等,最重要的是可以对动画进行编程以响应手动操
基于vue将json绘制图 Vue布局撰写者 (vue-layout-composer)
Dynamic, drag & drop, JSON-based grid layout for Vue.
Vue基于JSON的动态,拖放式网格布局。
Create your components, specify your JSON layout configuration and let th...
有一天我们的UI设计师找到我说,要把页面中我自己用程序写的动画,换成他们给的json动画,原因是有的动画很复杂,自己写起来达不到他们的预期效果(写到这里我突然想到一个问题,这么复杂的动画为什么不使用gif。。。。坐我对面的安卓开发小哥答因为gif播放的时候可能质量不高不流畅,好吧我信了)
我:????客户端可以加json动画,H5页面没听说过可以读json动画哎
设计师一脸肯定,说可以的,有web版本。
写到这里,我真的要好好夸一波我们的设计师妹子了,几乎很多蛮好的解决方法都是在他们的“逼迫”之下找到的(哦,她们还会写H5页面。。。要我有何用系列
那问题来了,怎么在H5页面里面使用j
一、Lottie简介与作用
Lottie是一个库,可以解析使用AE制作的动画(
需要
用bodymovin导出为json格式),支持web、ios、android和react native。在前端使用,lottie-web库可以解析导出的动画json文
件
,并将其以svg、canvas或者html的方式将动画绘制到页面中。
Lottie实现原理是由设计师出动画,导出为json,给前端展示。动画由设计使用制作工具Adobe After Effects来实现,然后前端不仅可以节约开发成本,而且可以高度还原设计
其实这个插
件
使用方法特别简单,但是为啥说一下呢,一、是为了自己记录下整体的使用流程,因为也并不是说非常常用,避免以后就忘了,二、是我想记录下和ui的交互,怎么改json;三、是帮助小白
GO一、基本使用方法
一、基本使用方法
npm install lottie-web
2、引入页面中
import lottie from "lottie-web"
import animationData from '@/assets/animations/data.json' //这个json动画文
件
是UI给
在 Linux 下编写 makefile 的方法如下:
1. 定义变量,如 CC(编译器)、CFLAGS(编译选项)、SRC_DIR(源码所在文
件
夹)、OBJ_DIR(目标文
件
所在文
件
夹)等。
2. 在目标文
件
和依赖文
件
之间建立关系,如 $(OBJ_DIR)/%.o : $(SRC_DIR)/%.c。
3. 添加编译和
链接
命令,如 $(CC) $(CFLAGS) -c $< -o $@ 和 $(CC) $(CFLAGS) -o $@ $^。
4. 添加清理命令,如 rm -f $(OBJ_DIR)/*.o。
5. 通过在命令行中运行 make 命令来执行 makefile。
以下是一个示例 makefile,它能够编译 header 文
件
所在文
件
夹和 source 文
件
所在文
件
夹,并且可以
链接
静态
库和
动态库
:
CC = gcc
CFLAGS = -I/path/to/headers -L/path/to/libraries -lm -static
SRC_DIR = src
OBJ_DIR = obj
# 将所有 .c 文
件
转换为 .o 文
件
$(OBJ_DIR)/%.o : $(SRC_DIR)/%.c
$(CC) $(CFLAGS) -c $< -o $@
#
链接
所有 .o 文
件
main : $(OBJ_DIR)/main.o $(OBJ_DIR)/foo.o $(OBJ_DIR)/bar.o
$(CC) $(CFLAGS) -o $@ $^
# 清理文
件
clean :
rm -f $(OBJ_DIR)/*.o
要编译这个 makefile,请在终端中键入 make。要清理文
件
,请键入 make clean。
注意:这个示例中的路径和文
件
名应该替换