一、库
由于版权原因,库函数的源代码一般是不可见的,但在暴露的头文件中你可以看到它对外的接口
库函数简介,使用的时候,直接引入头文件#include<>即可。
二、静态库
1.概念
程序在编译链接的时候把库的代码链接到可执行文件中,程序运行的时候就不再需要静态库。
2.特点
可执行文件中包含了库代码的一份完整拷贝,程序缺点就是被多次使用就会有多份冗余拷贝。 但是可执行文件运行速度快。
三、动态库
1.特点
程序在运行时由系统动态加载到内存中供程序调用。使用动态库的优点是系统只需载入一次动态库,不同的程序可以得到内存中相同的动态库的副本,可共享代码,因此节省了很多内存。
四、区别
1.静态库在编译链接时调用,动态库在运行时调用。
2.静态库在运行已经嵌入可执行文件中,所以执行速度快。
3.静态库有可能会出现多份相同代码,动态库对于多个可执行文件只有一份,节省了硬盘和磁盘空间。
4.静态库编译完之后,所有用到的函数全部链接到exe文件中,就一个光光的exe;动态库编译完之后是要有一个exe和dll同时在,才能运行。dll可以被多个程序同时使用。
五、库的类型
(一) 在windows中
.dll 动态库
.lib 静态库
库即为源代码的二进制文件
(二) 在linux中
.so 动态库
.a 静态库
六、创建静态库及使用
第一步:汇编文件.s生成目标文件.o,使用-c选项。
第二步:生成静态库。
第三步:查看静态库。
第四步:使用静态库。
//生成静态库
ar -rc libmymath.a add.o sub.o mul.o div.o
ar:gnu的归档工具,rc:取代并创建。
lib和.a是库名的前缀和后缀。
//查看静态库
ar -tv libmymath.a
t:列出静态库中的文件
v:详细信息
//使用静态库
gcc main.c -L. -lmymath
-L:指定库路径
-l:指定库名,库名不包含前缀和后缀。
测试目标生成后,静态库删掉,程序依然可以运行。
七、创建动态库及使用
//-fPIC
表明使用地址无关码,使共享物理内存不被修改。
//-shared
表示产生共享库
//ldconfig可以进行配置,使新安装的动态库为系统所共享。然后使用ldconfig进行更新。