一:什么是动态库与静态库
静态库:程序在编译链接的时候把库的代码链接到可执行文件中。
动态库:程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。
二:分别的优点和缺点
静态库:
优点:
静态库被打包到应用程序中加载速度快
发布程序无需提供静态库,因为已经在app中,移植方便
缺点:
链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝。
更新、部署、发布麻烦。
动态库:
优点:
链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序可以共用,节省内存。
程序升级简单,因为app里面没有库的源代码,升级之后只要库的名字不变,函数名以及参数不变,只是实现做了优化,就能加载成功。
缺点:
加载速度比静态库慢
发布程序需要提供依赖的动态库
三:如何制作静态库与动态库
制作静态库:
第一步:将要打包的 xxx.c 文件 生成 xxx.o文件:
gcc xxx.c -c
第二步: 用 xxx.o文件 生成静态库文件(打包):
ar -rcs this.a xxx.o
生成的静态库文件把头和尾去掉(把 lib 和 .a 去掉)就是库的名称
ar命令是gnu的归档工具,常用于将目标文件打包为静态库,下面我们使用ar命令的-r 选项和-c选项进行打包。
- -r(replace):若静态库文件当中的目标文件有更新,则用新的目标文件替换旧的目标文件。
- -r(rreate):建立静态库文件。
静态库的使用
gcc mytest.c -I ./lib -L ./lib -l mymath
我们在使用静态库进行编译链接时,需要指定头文件的所在路径,库文件的所在路径以及所要掉用的库名称
- -I:指定头文件所在路径。
- -L:指定库文件所在路径。
- -l:指明需要链接库文件路径下的哪一个库
制作动态库
将要打包的 xxx.c 文件生成动态库文件:
gcc -shared -fpic xxx.c -o libxxx.so
动态库的使用:
gcc main.c -lnew -L ./ -o xxx
动态库路径指定
方法一:在配置文件/etc/ld.so.conf中指定动态库搜索路径。
vi /etc/ld.so.conf
添加 lib目录
ldconfig
方法二:通过环境变量LD_LIBRARY_PATH指定动态库搜索路径。
export LD_LIBRARY_PATH=”LD_LIBRARY_PATH:/opt/”
方法三:在编译目标代码时指定该程序的动态库搜索路径。
还可以在编译目标代码时指定程序的动态库搜索路径。通过gcc 的参数”-Wl,-rpath,”指定