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)命令检查可执行文件动态库依赖关系

静态库的优缺点

静态库的优点

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

静态库的缺点

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

动态库的优缺点

动态库的优点

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

动态库的缺点

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

动态库与静态库的选择

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

相关文章
|
1月前
|
API C++ Windows
Visual C++运行库、.NET Framework和DirectX运行库的作用及常见问题解决方案,涵盖MSVCP140.dll丢失、0xc000007b错误等典型故障的修复方法
本文介绍Visual C++运行库、.NET Framework和DirectX运行库的作用及常见问题解决方案,涵盖MSVCP140.dll丢失、0xc000007b错误等典型故障的修复方法,提供官方下载链接与系统修复工具使用指南。
469 2
|
1月前
|
Ubuntu API C++
C++标准库、Windows API及Ubuntu API的综合应用
总之,C++标准库、Windows API和Ubuntu API的综合应用是一项挑战性较大的任务,需要开发者具备跨平台编程的深入知识和丰富经验。通过合理的架构设计和有效的工具选择,可以在不同的操作系统平台上高效地开发和部署应用程序。
98 11
|
1月前
|
缓存 算法 程序员
C++STL底层原理:探秘标准模板库的内部机制
🌟蒋星熠Jaxonic带你深入STL底层:从容器内存管理到红黑树、哈希表,剖析迭代器、算法与分配器核心机制,揭秘C++标准库的高效设计哲学与性能优化实践。
C++STL底层原理:探秘标准模板库的内部机制
|
1月前
|
IDE 编译器 开发工具
msvcp100.dll,msvcp120.dll,msvcp140.dll,Microsoft Visual C++ 2015 Redistributable,Visual C++ 运行库安装
MSVC是Windows下C/C++开发核心工具,集成编译器、链接器与调试器,配合Visual Studio使用。其运行时库(如msvcp140.dll)为程序提供基础函数支持,常因缺失导致软件无法运行。通过安装对应版本的Microsoft Visual C++ Redistributable可解决此类问题,广泛应用于桌面软件、游戏及系统级开发。
267 2
|
2月前
|
并行计算 C++ Windows
|
算法 C++ 容器
C++标准库(速查)总结
C++标准库(速查)总结
313 6
|
存储 算法 C++
C++ STL 初探:打开标准模板库的大门
C++ STL 初探:打开标准模板库的大门
268 10
|
10月前
|
JSON C++ 数据格式
C++20 高性能基础库--兰亭集库助力开发者构建高性能应用
这次分享的主题是《高性能基础库--兰亭集库助力开发者构建高性能应用》的实践经验。主要分为三个部分: 1. 业务背景 2. 雅兰亭库架构 3. 业务优化
303 9
|
10月前
|
XML 网络协议 API
超级好用的C++实用库之服务包装类
通过本文对Boost.Asio、gRPC和Poco三个超级好用的C++服务包装类库的详细介绍,开发者可以根据自己的需求选择合适的库来简化开发工作,提高代码的效率和可维护性。每个库都有其独特的优势和适用场景,合理使用这些库可以极大地提升C++开发的生产力。
242 11

热门文章

最新文章