C/C++静态库和动态库的制作、使用、优缺点

简介: C/C++静态库和动态库的制作、使用、优缺点

C++程序员必会的知识储备


什么是库???

  • 库文件是计算机上的一类文件,可以简单的把库文件看成一种代码仓库,它提供给使用者一些可以直接拿来用的变量、类、函数等
  • 库是一种特殊的程序,编写库文件和编写一般的程序的区别不大,只是库文件不能单独运行
  • 库文件有两种,静态库和动态库(共享库) ,静态库在程序的链接阶段就被复制到了程序中,而动态库在链接阶段只是被记录的一些信息(如文件名),而没有把动态库复制到程序中,而是在程序运行阶段由系统动态加载到内存中供程序调用。
  • 库的好处:代码保密(c++程序即使被反编译也只能还原20%左右) 、方便部署和发布    

静态库的制作和使用

1).命名规则

lib + 库的名字 + .a [windows 下静态库以 .lib结尾]

2).制作步骤

  • 生成对应的 .o文件(.o为目标文件,即二进制文件,经过汇编器处理过的)   gcc  -c   *.c  -Iinclude
  • 将生成的.o文件打包(使用ar工具) ar rcs 库名(libXXX.a) *.o

3).静态库的使用(头文件:提供了接口,方便调用库中的函数)

  • gcc main.c  lib/libXXX.a -o app -Iinclude
  • gcc main.c -L lib -l XXX -o app  -Iinclude

4).查看静态库里的东西     nm libXXX.a

5).查看可执行文件里的东西   nm app

动态库(共享库)的制作和使用

1).命名规则

lib + 库的名字 + .so [windows 下动态库以 .dll结尾]

2).制作步骤

  • 生成对应的.o文件(此时的.o文件要与位置无关)  gcc -fpic -c  *.c -Iinclude
  • 将.o文件打包成共享库   gcc -shared -o libXXX.so *.o -Iinclude

3).动态库的使用

  • gcc mian.o lib/libXXX.so -Iinclude -o app
  • gcc main.o -L ./lib -l XXX -o app -I ./include

4).查询可执行文件在执行的时候所依赖的所有动态库   ldd 可执行文件

libCalc.so  ==> not found   说明动态库libXXX.so没有找到

在运行是无法加载到  libCalc.so

5).系统如何定位共享文件?

       当系统加载可执行代码的时候,能够知道其所依赖的库的名字,但是还需要知道文件的绝对路径。此时就需要系统的动态载入器来完成,对elf格式的可执行文件,是由ld-linux.so完成的。

最后一行:ld-linux-x86-64.so

搜索elf文件的顺序:

DT_RPATH(我们改变不了) —>环境变量(path)LD_LIBRARY_PATH —> /etc/ld.so_cache文件列表

—>/lib/     /use/lib

如果找到库文件的绝对路径后,将其载入到内存中。

6).解决动态库链接失败的的原因(按道理有5种方法)

  • 改变DT_RPATH   改变不了,此法行不通
  • 改变环境变量(path)LD_LIBRARY_PATH
  1. 临时改变:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:动态库目录的绝对路径                                                                                       /home/chen/MyWorkingSpace/library/lib
  2. 永久改变:在~/bashrc 文件中加入 这句话   然后更新  . .bashrc
  • 改变系统的 etc/profile文件中加入这句话
  • 修改/etc/ld.so.conf, 将动态库目录的绝对路径写入   然后更新 sudo ldconfig -v(打印详细信息)

动态库和静态库的工作原理

静态库:GCC进行链接时,会把静态库中的代码打包到可执行程序中

动态库:GCC进行链接时,动态库的代码不会被打包到可执行程序中(会记录一些信息,如名字)在程序启动之后,动态库会被动态加载到内存中。通过ldd(list dynamic dependcies)命令检查可执行文件动态库依赖关系

静态库的优缺点

静态库的优点

  • 方便移植:发布程序的时候,不需要提供对应的库,因为库已经打包到可执行文件中
  • 加载速度快(其实相比动态库快不了多少的)

静态库的缺点

  • 消耗系统资源,浪费内存:库打包到应用程序中,导致库的体积很大
  • 库发生了改变(维护、升级),需要重新编译程序,导致更新、部署、发布麻烦

动态库的优缺点

动态库的优点

  • 执行程序体积小
  • 动态库更新了,不重新编译程序(函数接口不变),更新、部署、发布简单
  • 可以控制何时加载动态库

动态库的缺点

  • 发布程序的时候,需要将动态库提供给用户
  • 动态库没有被打包到应用程序中,加载速度相对较慢

动态库与静态库的选择

在库很小的时候,建议使用静态库。当库比较大的时候,尽量使用动态库。

目录
打赏
0
0
0
0
1
分享
相关文章
|
5月前
|
C++标准库(速查)总结
C++标准库(速查)总结
119 6
|
5月前
|
C++ STL 初探:打开标准模板库的大门
C++ STL 初探:打开标准模板库的大门
148 10
超级好用的C++实用库之服务包装类
通过本文对Boost.Asio、gRPC和Poco三个超级好用的C++服务包装类库的详细介绍,开发者可以根据自己的需求选择合适的库来简化开发工作,提高代码的效率和可维护性。每个库都有其独特的优势和适用场景,合理使用这些库可以极大地提升C++开发的生产力。
54 11
【C语言】C++ 和 C 的优缺点是什么?
C 和 C++ 是两种强大的编程语言,各有其优缺点。C 语言以其高效性、底层控制和简洁性广泛应用于系统编程和嵌入式系统。C++ 在 C 语言的基础上引入了面向对象编程、模板编程和丰富的标准库,使其适合开发大型、复杂的软件系统。 在选择使用 C 还是 C++ 时,开发者需要根据项目的需求、语言的特性以及团队的技术栈来做出决策。无论是 C 语言还是 C++,了解其优缺点和适用场景能够帮助开发者在实际开发中做出更明智的选择,从而更好地应对挑战,实现项目目标。
148 0
|
5月前
|
C++常用基础知识—STL库(2)
C++常用基础知识—STL库(2)
101 5
C++常用基础知识—STL库(1)
C++常用基础知识—STL库(1)
98 1
超级好用的C++实用库之跨平台实用方法
超级好用的C++实用库之跨平台实用方法
67 6
|
6月前
|
超级好用的C++实用库之环形内存池
超级好用的C++实用库之环形内存池
113 5
超级好用的C++实用库之套接字
超级好用的C++实用库之套接字
54 1
超级好用的C++实用库之sha256算法
超级好用的C++实用库之sha256算法
217 1