静态库与动态库
库是一种可执行的二进制文件,是编译好的代码。使用库可以提高开发效率。在 Linux 下有静态库和动态库,两者加载时间不同。
1.静态库与动态库的区别
静态库在程序编译的时候会被链接到目标代码里面。所以程序在运行的时候不再需要静态库了。因此编译出来的体积就比较大。以 lib 开头,以 .a 结尾。eg: libmylib.a
动态库(动态库也叫共享库)在程序编译的时候不会被链接到目标代码里面,而是在程序运行的时候被载入的。所以程序在运行的时候需要动态库了。因此编译出来的体积就比较小。以 lib 开头,以 .so 结尾。eg: libmylib.so
2.静态库与动态库各自优缺点
静态库优点:
- 静态库被打包到应用程序中加载速度快。
- 移植方便,发布程序时不用提供静态库。
静态库缺点:
- 相同的库文件数据可能在内存中被加载多份,效耗系统资源,浪费内存。
- 库文件更新需要重新编译项目文件,生成新的可执行程序,浪费时间。
动态库优点:
- 动态库升级简单,只需要替换库文件,无需重新编译程序。
- 可以控制何时加载动态库,不调用库函数动态库不会被加载。
- 可实现不同进程间的资源共享。
动态库缺点:
- 加载速度比静态库慢。
- 发布程序需要提供动态库。
3.静态库的制作和使用
- 编写或准备库的源代码
/*mylib.c*/
#include<stdio.h>
void mylib(void);
void mylib(void)
{
printf("This is mylib\n");
}
复制代码
- 将源码.c 文件编译生成.o 文件
gcc -c mylib.c //生成mylib.o文件
- 使用 ar 命令创建静态库
ar cr libmylib.a mylib.o //
参数:c:创建
r:覆盖
libmylib.a:库文件名
mylib.o:创建库所使用的文件
- 测试库文件 (编写测试代码 test1.c)
#include <stdio.h>
void mylib(void);
int main(void)
{
mylib();
return 0;
}
编译测试文件 test1.c
gcc test1.c -lmylib -L .
// -小l 后面跟所用的静态库名
// -大L 后面跟所用静态库的查找位置
4.动态库的制作和使用
- 编写或准备库的源代码
/*mylib.c*/
#include<stdio.h>
void mylib(void);
void mylib(void)
{
printf("This is mylib\n");
}
- 将源码.c 文件编译生成.o 文件
gcc -c -fpic mylib.c //-fpic:生成位置无关代码
- 使用 gcc 命令创建动态库
gcc -shared -o libmylib.so mylib.o //-shared:生成动态库
- 测试库文件
gcc test1.c -l mylib -L . //生成a.out文件
// -l 后面跟所用的动态库名
// -L 后面跟所用动态库的查找位置
5.因为动态库不会被编译在程序文件中,所以我们要多一步,告诉计算机动态库的位置
一共有三种方法(推荐第三种):
- 第一种方法: 将生成的动态库拷贝到/lib 或者/usr/lib 里面去,因为系统会默认去这俩个路径下寻找。(不建议)
- 把我们的动态库所在的路径加到环境变量里面去,比如我们动态库所在的路径为/home/test,我们就可 以这样添加,但是这种方法只在当前设置的窗口有效
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/dlxy/sambashare/嵌入式学习之Linux系统编程篇
复制代码
- 修改 ubuntu 下的配置文件/etc/ld.so.conf,我们在这个配置文件里面加入动态库所在的位置,然后使用 命令 ldconfig 更新目录。
vi /etc/ld.so.conf
ldconfig
参考: 1.juejin.cn/post/707782… Linux系统编程 2.blog.csdn.net/weixin_5148… 静态库与动态库的区别