动态库和静态库[亲测有效]

动态库和静态库[亲测有效]【1】库的概念1.库是一个二进制可执行的文件;(存储功能函数)2.库需要被载入到内存中使用3.比较于二进制程序,库是不能单独运行的4.每个操作系统都有自己的库,不兼容。1.库的分类1.静态库2.动态库可以通过后缀来区分静态库或者动态库 windows linux 静态库 *.lb libxxx.a 动态库 *.lld libxxx.so 2.库存在的意义 库是已经写好的,成熟的,可以复用的功能代码,我们写的很多代码都

大家好,欢迎来到IT知识分享网。

【1】库的概念

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

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

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

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

1.库的分类

1.静态库

2.动态库

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

windows linux
静态库 *.lb libxxx.a
动态库 *.lld libxxx.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. 程序更新部署比较方便

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/24863.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信