静态库和动态库

目录

1、库的概念

2、库的分类

3、库存在的意义

4、静态库的原理及优缺点

5、静态库的制作及使用

制作静态库: ​

        1、编译出目标文件:

        2、打包目标文件生成静态库文件:

使用静态库: ​

1、直接使用:

2、指定库文件的查找位置:

3、通过设置环境变量指定库的默认查找路径 + -lname ​

6、动态库的原理及优缺点

7、动态库的制作及使用

制作动态库: ​

1、编译生成目标文件: ​

2、生成动态库: ​

使用动态库: ​

1、直接编译使用 ​

2、指定库文件的查找位置 ​:

3、通过设置环境变量指定库的默认查找路径 + -lname ​

8、静态库和动态库的区别(重点)

静态库:

动态库:


1、库的概念

  • 库是一个二进制可执行文件,需要被载入到内存中使用,不能单独运行 ​ 2、每个操作系统都有自己的库

2、库的分类

  • 静态库 libxxx.a(Linux) *.lb(windows) ​ 动态库 libxxx.so(Linux) *.llb(windows)

3、库存在的意义

  • 把代码封装成库是为了方便使用,方便管理,安全性高,保密性强,提高代码移植效率

4、静态库的原理及优缺点

  • 在程序编译到链接库时,把静态库函数继承(拷贝二进制指令)到二进制文件中,生成可执行文件 ​
  • 优点:运行速度快 ​ 编译成功后,程序可以脱离静态库, ​
  • 缺点:可执行文件相对较大 ​ 当静态库修改后,可执行文件就需要重新编译

5、静态库的制作及使用

制作静态库:

        1、编译出目标文件:

                gcc -c code.c ​

        2、打包目标文件生成静态库文件:

                ar -r libname.a a.o b.o c.o... ​

注意:静态库文件名字前缀(lib)、后缀(.a)不能改变

使用静态库:

1、直接使用:

        gcc code.c libname.a ​

2、指定库文件的查找位置:

        -L 指定库的路径 -l指定库名(去掉前缀和后缀的name) ​

        gcc code.c -L/path -l name ​

3、通过设置环境变量指定库的默认查找路径 + -lname ​

  • 打开操作系统配置文件: ​ vim ~/.bashrc(有vim编辑器的情况下) ​
  • 在文件末尾追加: ​ export LIBRARY PATH=$LIBRARY_PATH:/path ​
  • 保存退出重新加载配置文件: ​ source ~/.bashrc ​ 然后可以把静态库文件libname.a放入/path中 ​
  • 使用时: gcc code.c -lname

6、动态库的原理及优缺点

  • 当运行程序时,会把动态库一起加载到内存中(内存中如果不存在,则会把动态库加载到内存中),调用共享库函数,函数名就是记录了他在共享库中的位置,本质上是跳转到动态库中的对应位置执行 ​
  • 优点:可执行文件相对较小,当动态库修改后,可执行文件不需要重新编译 ​
  • 缺点:与静态库相比,运行速度较慢,需要依赖共享库文件

7、动态库的制作及使用

制作动态库:

1、编译生成目标文件: ​

        gcc -fpic -c code.c ​

2、生成动态库: ​

        gcc -shared -fpic a.o b.o... -o libname.so ​

使用动态库:

1、直接编译使用 ​

        gcc code.c libname.so ​

注意:只能编译成功,如果想要使用,需要把动态库放入系统指定库加载路径 ​

2、指定库文件的查找位置 ​:

        -L指定库的路径 -l指定库名(去掉前缀和后缀的name) ​

        gcc code.c -L /path -l name ​

3、通过设置环境变量指定库的默认查找路径 + -lname ​

注意:

        a. 运行动态库时,会去默认路径加载动态库,也可通过设置环境变量的方法,增加加载共享库的加载路径,方法和静态库设置环境变量相同 ​

        b. 编译时,如果同时存在同名的共享库与静态库,编译器会优先使用共享库,加上 -static 编译参数,优先使用同名的静态库

8、静态库和动态库的区别(重点)

静态库:

        1、libname.a格式命名

        2、在程序编译时,直接将静态库拷贝到可执行程序中,因此可执行文件比较大

        3、可执行程序脱离静态库后不受影响

        4、静态库修改后,程序需要重新编译生成新的可执行文件 ​

动态库:

        1、libname.so格式命名

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

        3、脱离动态库后,可执行程序会崩溃

        4、动态库修改后,不需要重新编译程序

你可能感兴趣的:(linux,服务器,c++)