一:什么是动态库与静态库

静态库:程序在编译链接的时候把库的代码链接到可执行文件中。

动态库:程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。

二:分别的优点和缺点

静态库:
优点:

静态库被打包到应用程序中加载速度快

发布程序无需提供静态库,因为已经在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,”指定