一文说透静态库与动态库

145 阅读3分钟

静态库与动态库

库是一种可执行的二进制文件,是编译好的代码。使用库可以提高开发效率。在 Linux 下有静态库和动态库,两者加载时间不同。

1.静态库与动态库的区别

静态库程序编译的时候会被链接到目标代码里面。所以程序在运行的时候不再需要静态库了。因此编译出来的体积就比较大。以 lib 开头,以 .a 结尾。eg: libmylib.a

动态库(动态库也叫共享库)在程序编译的时候不会被链接到目标代码里面,而是在程序运行的时候被载入的。所以程序在运行的时候需要动态库了。因此编译出来的体积就比较小。以 lib 开头,以 .so 结尾。eg: libmylib.so

2.静态库与动态库各自优缺点

静态库优点:

  1. 静态库被打包到应用程序中加载速度快。
  2. 移植方便,发布程序时不用提供静态库。

静态库缺点:

  1. 相同的库文件数据可能在内存中被加载多份,效耗系统资源,浪费内存。
  2. 库文件更新需要重新编译项目文件,生成新的可执行程序,浪费时间。

动态库优点:

  1. 动态库升级简单,只需要替换库文件,无需重新编译程序。
  2. 可以控制何时加载动态库,不调用库函数动态库不会被加载。
  3. 可实现不同进程间的资源共享。

动态库缺点:

  1. 加载速度比静态库慢。
  2. 发布程序需要提供动态库。

3.静态库的制作和使用

  1. 编写或准备库的源代码
/*mylib.c*/
#include<stdio.h>
void mylib(void);
void mylib(void)
{
	printf("This is mylib\n");
}
复制代码
  1. 将源码.c 文件编译生成.o 文件
gcc -c mylib.c  //生成mylib.o文件
  1. 使用 ar 命令创建静态库
ar cr libmylib.a mylib.o  //
参数:c:创建  
	 r:覆盖
	 libmylib.a:库文件名
	 mylib.o:创建库所使用的文件
  1. 测试库文件 (编写测试代码 test1.c)
#include <stdio.h>
void mylib(void);
int main(void)
{
	mylib();
	return 0;
}

编译测试文件 test1.c

gcc test1.c -lmylib -L .
// -小l 后面跟所用的静态库名
// -大L 后面跟所用静态库的查找位置

4.动态库的制作和使用

  1. 编写或准备库的源代码
/*mylib.c*/
#include<stdio.h>
void mylib(void);
void mylib(void)
{
	printf("This is mylib\n");
}
  1. 将源码.c 文件编译生成.o 文件
gcc -c -fpic mylib.c  //-fpic:生成位置无关代码
  1. 使用 gcc 命令创建动态库
gcc -shared -o libmylib.so mylib.o  //-shared:生成动态库
  1. 测试库文件
gcc test1.c -l mylib -L .  //生成a.out文件
// -l 后面跟所用的动态库名
// -L 后面跟所用动态库的查找位置

5.因为动态库不会被编译在程序文件中,所以我们要多一步,告诉计算机动态库的位置

一共有三种方法(推荐第三种):

  1. 第一种方法: 将生成的动态库拷贝到/lib 或者/usr/lib 里面去,因为系统会默认去这俩个路径下寻找。(不建议)
  2. 把我们的动态库所在的路径加到环境变量里面去,比如我们动态库所在的路径为/home/test,我们就可 以这样添加,但是这种方法只在当前设置的窗口有效
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/dlxy/sambashare/嵌入式学习之Linux系统编程篇
复制代码
  1. 修改 ubuntu 下的配置文件/etc/ld.so.conf,我们在这个配置文件里面加入动态库所在的位置,然后使用 命令 ldconfig 更新目录。
vi /etc/ld.so.conf

ldconfig

参考: 1.juejin.cn/post/707782… Linux系统编程 2.blog.csdn.net/weixin_5148… 静态库与动态库的区别