动态库和静态库

16 篇文章 0 订阅

【1】库的概念

1.库是一个二进制可执行的文件;(存储功能函数)

2.库需要被载入到内存中使用

3.比较于二进制程序,库是不能单独运行的

4.每个操作系统都有自己的库,不兼容。

1.库的分类

1.静态库

2.动态库

可以通过后缀来区分静态库或者动态库

windowslinux
静态库*.lblibxxx.a
动态库*.lldlibxxx.so

2. 库存在的意义

  1. 库是已经写好的,成熟的,可以复用的功能代码,我们写的很多代码都是依赖于基础库

  2. 提高代码移植效率,可以不用移植源码,直接移植库即可;

【2】静态库

1. 静态库的原理

用静态库封装功能函数,在程序编译到 链接库 步骤,将静态库函数 继承 到二进制文件中,最终生成一个可执行二进制程序;

优点:

  1. 程序运行的时候,与静态库没有任何关系,可以完全脱离静态库

  2. 方便移植;

缺点:

  1. 存储的时候浪费磁盘空间

  2. 运行的时候浪费内存空间

2. 静态库的制作及使用

1)制作步骤

gcc -c func.c - o func.o    一步完成预处理、编译、汇编步骤
ar -crs libfunc.a func.o    生成静态库,且库的名字是func
​
如果有多个.o文件的时候
ar -crs libfunc.a func.o func1.o func2.o func3.o

静态库命名规则

以lib开头,后面紧跟库名,以.a结尾

例子:libxxx.a xxx是才库名

2)使用步骤

gcc main.c -L库的路径 -l库的名字            //默认生成一个a.out二进制程序
gcc main.c -L./ -lfunc
​
gcc main.c -o main -L库的路径 -l库的名字    //生成一个main二进制程序
gcc main.c -o main -L./ -lfunc

【3】动态库(共享库)

1. 动态库的原理

动态库,把库函数的链接推迟到程序运行的时候。

当程序执行到库函数的时候,会去找动态库中的相关函数。如果内存中不存在该动态库,则会将动态库加载到内存中。

如果内存中已经存在该动态库,则直接调用动态库。

优点:

  1. 可执行程序运行的时候,节省内存空间。

  2. 程序存储的时候,节省磁盘空间。

缺点:

程序运行的时候,如果没有找到动态库,则会导致程序崩溃。

2. 动态库的制作

1)制作指令

gcc -Wall  -fPIC -c func.c -o func.o    一步完成预处理、编译、汇编步骤
gcc -shared -o libfunc.so func.o        生成动态库,且库的名字是func
​
如果有多个.o文件的时候
gcc -shared -o libfunc.so func.o func1.o func2.o func3.o

动态库命名规则

以lib开头,后面紧跟库名,以.so结尾

例子:libxxx.so xxx是才库名

2)使用步骤

gcc main.c -L库的路径 -l库的名字            //默认生成一个a.out二进制程序
gcc main.c -L./ -lfunc
​
gcc main.c -o main -L库的路径 -l库的名字    //生成一个main二进制程序
gcc main.c -o main -L./ -lfunc

$ ldd main linux-vdso.so.1 (0x00007ffcccbd7000) libfunc.so => not found libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7803e97000) /lib64/ld-linux-x86-64.so.2 (0x00007f780448a000)

没有配置环境变量,则会默认到 /lib/ 或者 /usr/lib/ 中寻找动态库

3)配置环境变量

  1. 将动态库移动到 /lib/ 或者 /usr/lib/ 目录下

    $ sudo mv libfunc.so /lib/
    $ sudo mv libfunc.so /usr/lib
    
  2. 在LD_LIBRARY_PATH这个环境变量中,添加上库的路径

    $ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:动态库的绝对路径
    $ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/ubuntu/mydir/3_81IO进程线程/3_lib/2_libxx.so

    注意:只在当前终端有效

  3. 在 /etc/ld.so.conf.d/ 创建一个以 .conf结尾的普通文件;

    将动态库的绝对路径写入到该文件中。($ pwd 可以查看绝对路径)

    执行 sudo ldconfig

$ cd /etc/ld.so.conf.d/
$ sudo vim my.conf
$ sudo ldconfig

注意:文件中每一行只能添加一个动态库的路径;

【4】静/动态库的区别(重点)

1. 静态库

  1. libxxx.a格式命名

  2. 在程序编译的时候,直接将静态库继承到可执行程序中,因此可执行程序比较大

  3. 程序在运行的时候占用内存大,存储的时候占用磁盘大

  4. 可执行程序,脱离静态库后不受影响

  5. 程序的更新部署比较麻烦

2. 动态库

  1. libxxx.so格式命名

  2. 可执行程序编译的时候,不会连接到动态库,而是在程序执行的时候,将动态库加载到内存中。内存中最多只有一份。

    因此,可执行程序比较小

  3. 占用内存和磁盘比较小

  4. 可执行程序,脱离动态库后会崩溃

  5. 程序更新部署比较方便

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值