在linux 静态库简析中简要的介绍了静态库的相关东西,但在实际的工作中主要使用的是动态库,下面我们就来了解下动态库。
什么是动态库
动态库就是程序在运行时才会去链接库的代码,多个程序共享库的代码。一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码。
动态库的优缺点
优点:
1.链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序可以共用,节省内存。这也是和静态库的不同之处。
2.程序升级简单,因为app里面没有库的源代码,升级之后只要库的名字不变,函数名以及参数不变,只是实现做了优化,就能加载成功。
缺点:
1.加载速度比静态库慢
2.发布程序需要提供依赖的动态库
动态库的创建及使用
1.创建
gcc -shared -fpic funs.c -o libchen.so
-shared 指定生成动态库
-fpic 标准,fPIC 选项作用于编译阶段,在生成目标文件时就得使用该选项,以生成位置无关的代码,这里不做多解释。这样就生成了.so的动态库文件,下面我们来使用一下他。
2.使用
gcc mul.c -lchen -L ./ -o mul
编译以生成mul的可执行文件,但是我们在运行程序时会报错。因为Linux动态库的默认搜索路径是/lib和/usr/lib。动态库被创建后,一般都复制到这两个目录中。当程序执行时需要某动态库,并且该动 态库还未加载到内存中,则系统会自动到这两个默认搜索路径中去查找相应的动态库文件,然后加载该文件到内存中,这样程序就可以使用该动态库中的函数,以及该动态库的其它资源了。
我们可以通过环境变量LD_LIBRARY_PATH来指定动态库搜索路径。
export LD_LIBRARY_PATH=””,引号写入要指定的路径。这个时候再来运行程序就不会报错了。
下面是简单的两数相乘调用动态库的过程:
但是我们发现这样做在另一个终端上就不能运行了,因为我们所配置的环境变量是临时的,我们可以通过脚本来在另一个终端上运行出来,在这里不做过多介绍,下面是两个终端通过脚本来运行程序的结果。