前言
本文为笔者学习笔记,若有不妥之处,欢迎指出。
提示:以下是本篇文章正文内容,下面案例可供参考
一、库
定义:一组数据和代码的集合。
单一模型:将程序中的所有功能全部实现于一个的那一的源文件中内部。编译时间长,不易于维护和升级
不易于协作开发
分离模型:将程序中的不同功能模块划分到不同的源文件中,缩短了编译时间,易于维护和升级,多人协作。
缺点:.o文件太多
二、静态库(.a)
定义:是在程序执行前(编译)就加入到目标程序中去了。
这类库的名字一般是libxxx.a;利用静态函数库编译成的文件比较大,因为整个 函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了。当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译。
优点:
- 运行速度快 。
- 执行效率高。
- 移植方便。
缺点:
- 更新,发布,部署麻烦。
- 链接时完整的拷贝到可执行文件中,被多次使用就有多份冗余拷贝。
三、动态库(.so)
定义:程序在编译时并不会被连接到目标代码中,而是在程序运行时才会被载入,因此在程序运行时还需动态存在。
这类库的名字一般是libxxx.so;相对于静态函数库,动态函数库在编译的时候 并没有被编译进目标代码中,你的程序执行到相关函数时才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。由于函数库没有被整合进你的程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。
优点:
- 连接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序可以共用,节省内存。
- 程序升级简单,因为APP里面没有库的源代码,升级之后只要库的名字不改变,函数名以及参数不变,只是实现了优化,就能加载成功。
缺点:
- 加载速度比静态库慢。
- 程序运行时,需要提供依赖的动态库。
四、库的制作
1、静调库的制作
制作静态库需要把制作库的文件编译成 .o 文件
gcc xxx.c -c
生成 .o 文件后,在使用下面指令生成静态库
ar rcs libswap.a swap.o
此时静态库就只做完毕。
2、动态库的制作
制作动态库也需要把制作库的文件编译成 .o 文件
gcc xxx.c -c
生成 .o 文件后,在使用下面指令生成动态库
gcc -shared -fpic swap.c -o libSwap.so
/* 说明:
* -shared:指定生成动态库
* -fpic:标准,fPIC 选项作用于编译阶段,在生成目标文件时就得使用该选项,以生成位置无关的代码。
*/
此时动态库就制作完毕。
五、库的使用
1、静态库的使用
静态库的使用比较简单,先编译,之后直接使用
gcc demo6.c -lswap -L ./ -o demo6
/* 说明:
* -L:告诉编译器,在哪里找到这个库文件
* ./:也就是当前路径的意思
*/
运行:
./demo6
2、动态库的使用
动态库文件使用相比静调库比较困难,先编译
gcc demo6.c -lSwap -L ./ -o demo61
注意:此时编译出来的文件并不是可运行程序,需要动态链接。
方法一:
添加环境变量,不然程序找不到动态库文件的位置。
export LD_LIBRARY_PATH="/home/cjh/testBoKe"
方法二:
写一个 shell 脚本,内容如下:
export LD_LIBRARY_PATH="/home/cjh/testBoKe"
./demo61
给编写的脚本添加权限:
chmod 777 swap.sh
完成后直接运行脚本文件即可:
/swap.sh