概念:
参考博文链接:
https://www.cnblogs.com/sunsky303/p/7731911.html
https://blog.csdn.net/wk_bjut_edu_cn/article/details/81735956
静态库:
静态函数库:程序执行前(编译时)就加载到目标程序中去。
优点:
1.静态库打包到程序中加载速度快
2.发布程序无需提供静态库,已经在APP中,移植方便
缺点:
1.程序太大
2.链接时完整的拷贝到可执行文件,被多次使用就有多次冗余拷贝。
3.更细、部署、发布麻烦
动态库:
动态函数库:是在程序执行时动态临时由目标程序去调用。
优点:
1.程序小
2.链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序可共用,节省内存
3.程序升级简单,因为APP里没有库的源代码,升级时只要库的名字不变,函数名及参数不变,只是实现做了优化,就能加载成功。
缺点:
1.加载速度比静态库慢
发布程序需提供依赖的动态库
(重点)静态库的制作:
1.把要做成静态库的功能文件通过gcc xxx.c -c
来生产一个xxx.o
的文件。
2.将.o的文件打包:
ar rcs + 静态库的名字 + 原材料
例如:ar rcs libxxx.a xxx.o
//静态库格式是xxx.a,xxx.o是产生的.o原材料文件。
静态库的使用:
gcc xxx.c -lxxx -L ./ /* -l的xxx是静态库.a砍头去尾(砍掉lib和.a), -L ./ 是默认从当前路径去找头文件*/
补充(-L 是从制定位置找.h文件, ./是当前路径)
例子:
制作:
使用:
(重点)动态库函数制作:
gcc -shared -fpic xxx.c -o libxxx.so
xxx.c为要生成的功能函数代码,-shared 为制定生成动态库 ,-fpic :标准,选项作用于编译阶段,在生成目标文件时就得使用该选项,以生成位置无关的代码,
动态库的使用:
gcc xxx.c -lxxx -L ./ /* xxx.c 是主程序,-lxxx的xxx是libxxx.so砍头去尾 后面同静态库一样*/
带动态库的程序,可以指定该程序运行的时候,在 LD_LIBRARY_PATH所指定的路径去找库文件。
引用动态库怎样指定动态库的位置:
引用临时环境变量,换个窗口就得重新设置。一般为了操作方便写个.sh脚本。
export LD_LIBRARY_PATH="XXX你所要指定的位置的路径"
因为环境变量是临时的,一般都写个脚本去运行。
如何写脚本:
1.创建脚本文件:vi xxx.sh
2.把指定环境变量的函数写到脚本里面
3.注意脚本是没有可执行的权限----------------------,所以我们运行脚本前要先给它加可执行的权限chmod +x xxx.sh
4.再脚本里运行主程序(在运行脚本,运行过程:脚本先运行环境变量的函数,再去运行主程序,这样在别的窗口也能用。)
5.注意脚本是直接./运行,不用编译。运行要加后缀例如:./xxx.sh