静态库和动态库制作

简介: 静态库和动态库制作

前言

我们在编写代码的时候经常用到已有的接口,他们是以库的形式提供给我们使用的,而常见形式有两种,一种常以 .a 为后缀,为静态库;另一种以 .so 为后缀,为动态库。所谓的静态、动态指的是链接的过程。


一、静态库和动态库介绍

1、静态库

程序在编译链接的时候把库的代码链接到可执行文件中,程序运行的时候将不再需要静态库。

静态库在文件中静态展开,所以有多少文件就展开多少次,非常吃内存,100M 展开 100 次,就是 10G,但是这样的好处就是静态加载的速度快。


2、动态库

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

使用动态库会将动态库加载到内存,10 个文件也只需要加载一次,然后这些文件用到库的时候临时去加载,速度慢一些,但是很省内存。


二、静态库的制作及使用

静态库的名字是以 lib 开头,以 .a 结尾,例:libmylib.a

静态库生成的指令:

ar rcs libmylib.a file1.o

1、准备好源码

test.c

#include <stdio.h>
#include "sub.h"
int main(int argc, char *argv[])
{
    int i = 6, j = 3;
    int k;
    printf("main fun! && i = %d\n", i);
    k = sub_fun(i, j);
    printf("k = %d\n", k);
    return 0;
}

sub.c

#include <stdio.h>
int sub_fun(int a, int b)
{
    printf("sub fun!\n");
    return a - b;
}

sub.h

int sub_fun(int, int);

2、编译源码生成 .o 文件

gcc -c sub.c -o sub.o

3、制作静态库

ar rcs libmymath.a sub.o

4、使用静态库

gcc test.c libmymath.a -o test
./test


test.c 文件仅有 213 字节,而 test 文件有 16K 大小,所以静态库使用时,是直接编译到文件里面的。

三、动态库的制作及使用

动态库的名字是以 lib 开头,以 .so 结尾,例:libmylib.so

1、生成位置无关的 .o 文件

gcc -c sub.c -o sub.o -fPIC

使用 -fPIC 这个参数过后,生成的函数就和位置无关,挂上 @plt 标识,等待动态绑定

2、制作动态库

gcc -shared -o libmymath.so sub.o

3、使用动态库

  • -l :指定库名
  • -L :指定库路径
gcc test.c -o test -l mymath -L ./
./test

出错原因分析:

  • 连接器: 工作于链接阶段,工作时需要 -l 和 -L
  • 动态链接器: 工作于程序运行阶段,工作时需要提供动态库所在目录位置

解决办法:指定动态库路径并使其生效,然后再执行文件

4、指定动态库路径并使其生效

通过环境变量指定动态库所在位置: export LD_LIBRARY_PATH=动态库路径

export LD_LIBRARY_PATH=./
./test

当关闭终端,再次执行 test 时,又报错。

这是因为,环境变量是进程的概念,关闭终端之后再打开,是两个进程,环境变量发生了变化。

要想永久生效,需要修改 bash 的配置文件: vi ~./bashrc

永久生效方法:

  • vi ~/.bashrc
  • 写入 export LD_LIBRARY_PATH=动态库路径 保存
  • source ~/.bashrc,再重启终端 —> 让修改后的 .bashrc 生效
  • 执行 ./test


四、对比

1、静态库优缺点

  • 静态库的加载速度快
  • 发布程序无需提供静态库,移植方便
  • 消耗系统资源,浪费内存
  • 更新、部署和发布麻烦

2、动态库优缺点

  • 可以实现进程间的资源共享
  • 更新、部署、发布简单
  • 可以控制何时加载动态库
  • 加载速度比较慢
  • 发布程序时需要提供依赖的动态库
目录
相关文章
|
2月前
|
Linux Windows
静态库和动态库
本文详细介绍了静态库和动态库的概念及使用方法。在 Linux 系统中,静态库以 `libxxx.a` 形式存在,而动态库则为 `libxxx.so`。文章分别讲解了如何创建和使用这两种库,并提供了具体的命令示例。此外,还介绍了将库文件添加到系统目录的方法,包括直接复制到默认库路径、修改环境变量以及编辑系统配置文件等方案。适合初学者了解库文件的基本操作。
|
6月前
|
开发工具 iOS开发
制作传统动态库和静态库遇到的问题
制作传统动态库和静态库遇到的问题
40 1
|
6月前
|
Linux 编译器 开发者
C/C++动态库与静态库 的详细解析
C/C++动态库与静态库 的详细解析
651 0
|
6月前
|
消息中间件 NoSQL Linux
静态库与动态库
静态库与动态库
静态库与动态库
|
程序员 vr&ar C语言
C/C++静态库和动态库的制作、使用、优缺点
C/C++静态库和动态库的制作、使用、优缺点
215 0
|
存储 Cloud Native Linux
C++ 动态库与静态库的区别?
C++ 动态库与静态库的区别?
|
存储 Linux 编译器
什么是链接库 | 动态库与静态库
什么是链接库 | 动态库与静态库
159 0
|
Linux vr&ar C语言
Linux下静态库和动态库(共享库)的制作和使用
Linux下静态库和动态库(共享库)的制作和使用
143 0
|
Shell 开发工具 C语言
动态库与静态库
本文目标:⭐认识动态静态库,学会结合gcc选项,制作动静态库⭐⭐了解动态库加载过程⭐。
动态库与静态库
|
缓存 Unix Linux
linux系统编程(三)gcc常用技巧与静态库与动态库制作
linux系统编程(三)gcc常用技巧与静态库与动态库制作
270 0
linux系统编程(三)gcc常用技巧与静态库与动态库制作