Linux动态库和静态库详解


前言

本文为笔者学习笔记,若有不妥之处,欢迎指出。


提示:以下是本篇文章正文内容,下面案例可供参考

一、库

定义:一组数据和代码的集合。

单一模型:将程序中的所有功能全部实现于一个的那一的源文件中内部。编译时间长,不易于维护和升级
不易于协作开发
分离模型:将程序中的不同功能模块划分到不同的源文件中,缩短了编译时间,易于维护和升级,多人协作。
缺点:.o文件太多

二、静态库(.a)

定义:是在程序执行前(编译)就加入到目标程序中去了。

这类库的名字一般是libxxx.a;利用静态函数库编译成的文件比较大,因为整个 函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了。当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译。

优点:

  1. 运行速度快 。
  2. 执行效率高。
  3. 移植方便。

缺点:

  1. 更新,发布,部署麻烦。
  2. 链接时完整的拷贝到可执行文件中,被多次使用就有多份冗余拷贝。

三、动态库(.so)

定义:程序在编译时并不会被连接到目标代码中,而是在程序运行时才会被载入,因此在程序运行时还需动态存在。

这类库的名字一般是libxxx.so;相对于静态函数库,动态函数库在编译的时候 并没有被编译进目标代码中,你的程序执行到相关函数时才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。由于函数库没有被整合进你的程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。

优点:

  1. 连接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序可以共用,节省内存。
  2. 程序升级简单,因为APP里面没有库的源代码,升级之后只要库的名字不改变,函数名以及参数不变,只是实现了优化,就能加载成功。

缺点:

  1. 加载速度比静态库慢。
  2. 程序运行时,需要提供依赖的动态库。

四、库的制作

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

Guess you like

Origin blog.csdn.net/weixin_51363326/article/details/116592308