库是你可以使用它,但你不能看到它是如何实现的,因而库文件也赋予了库相同的特性,相当于库是提供了函数的接口,功能开发者会有注释,但是函数内部怎么实现的是看不到的。
静态库
静态库文件名的命名方式是“libxxx.a”,库名前加”lib”,后缀用”.a”,“xxx”为静态库名。
制作步骤
①首先把自己要写的材料也就是.c文件打包成.o文件
gcc xxx.c -c
②再把.a文件生成.o文件,注意取名要用lib开头
ar rcs libxxx.o xxx.c
静态库的使用
gcc xxx.c -lxxx -L 路径 -o
xxx.c是要编译的文件
lxxx 是静态库砍掉lib然后去掉.o
-L 静态库的位置,如果不指定,再找默认库目录 /lib或/usr/lib或/usr/local/lib底下找
优点 :
1.静态库被打包到应用程序中加载速度快
2.发布程序无需提供静态库,因为已经在app中,移植方便
缺点:
1.链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝。
2.更新、部署、发布麻烦。
动态库
动态库的名字与静态库的名字相似,都是以lib开头,但后缀是.so
制作步骤
gcc -shared -fpic xxx.c -o xxx.so
-shared 指定生成动态库
-fpic 标准,fpic 选项作用于编译阶段,在生成目标文件时就得使用该选项,以生成位置无关的代码。
xxx.c是要打包成库的材料
xxx.so是动态库的名字
动态库的使用
gcc xxx.c -lxxx -L 路径 -o
xxx.c是要编译的文件
lxxx 是动态库砍掉lib然后去掉.so
-L 动态库的位置,如果不指定,再找默认库目录 /lib或/usr/lib
或者输入 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:动态库的路径 (来指定程序动态链接库文件搜索路径)
但是这样配置只能在当前窗口执行有效,换一个窗口又需要重写指令
那么这时就可以写一个.sh的脚本来代替你输入复杂的指令
优点:
1.链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序可以共用,节省内存。
2.程序升级简单,因为app里面没有库的源代码,升级之后只要库的名字不变,函数名以及参数不变,只是实现做了优化,就能加载成功。
缺点:
1.加载速度比静态库慢
2.发布程序需要提供依赖的动态库
为了实验是否动态库和静态库对内存的使用是不一样的,可以用
du指令来看文件大小的区别
软链接
当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在其它的目录下输入生成链接的指令就可以生成一个指向该文件的链接,像在库文件底下经常会看到与“xxx.so.2.1.3”类似的文件,软连接有些类似于windows底下的快捷方式。
当我们输入指令
ls -la 看到 某个文件->某个文件,就是软连接
生成软连接
ln -s libxxx.so.2.50 libxxx.so
ln为指令
-s是参数
第一个是被链接的文件
第二个是生成的软链接
当然位置可以任意指定
如果一个文件有多个软连接,当某一处文件改动了,其他文件都会随之发生改变,这就是ln的作用
硬链接
硬连接指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。
生成硬链接
ln libxxx.so.2.50 libxxx.so
软链接去掉-s参数就是生成硬链接
如果一个文件有多个硬连接,当某一处文件改动了,其他文件也会随之发生改变