C++静态库与动态库

这次分享的宗旨是——让大家学会创建与使用静态库、动态库,知道静态库与动态库的区别,知道使用的时候如何选择。这里不深入介绍静态库、动态库的底层格式,内存布局等,有兴趣的同学,推荐一本书《程序员的自我修养——链接、装载与库》。

什么是库

库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常

本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:静态库(.a、.lib)和动态库(.so、.dll)。

所谓静态、动态是指链接。回顾一下,将一个程序编译成可执行程序的步骤:

静态库

之所以成为【静态库】,是因为在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中。因此对应的链接方式称为静态链接。

试想一下,静态库与汇编生成的目标文件一起链接为可执行文件,那么静态库必定跟.o文件格式相似。其实一个静态库可以简单看成是一组目标文件(.o/.obj文件)的集合,即很多目标文件经过压缩打包后形成的一个文件。静态库特点总结:

l  静态库对函数库的链接是放在编译时期完成的。

l  程序在运行时与函数库再无瓜葛,移植方便。

l  浪费空间和资源,因为所有相关的目标文件与牵涉到的函数库被链接合成一个可执行文件。

动态库

通过上面的介绍发现静态库,容易使用和理解,也达到了代码复用的目的,那为什么还需要动态库呢

为什么还需要动态库?

为什么需要动态库,其实也是静态库的特点导致。

l  空间浪费是静态库的一个问题。

l  另一个问题是静态库对程序的更新、部署和发布页会带来麻烦。如果静态库liba.lib更新了,所以使用它的应用程序都需要重新编译、发布给用户(对于玩家来说,可能是一个很小的改动,却导致整个程序重新下载,全量更新)。

动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入。不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例,规避了空间浪费问题。动态库在程序运行是才被载入,也解决了静态库对程序的更新、部署和发布页会带来麻烦。用户只需要更新动态库即可,增量更新

动态库特点总结:

l  动态库把对一些库函数的链接载入推迟到程序运行的时期。

l  可以实现进程之间的资源共享。(因此动态库也称为共享库)

l  将一些程序升级变得简单。

l  甚至可以真正做到链接载入完全由程序员在程序代码中控制(显示调用)。

Window与Linux执行文件格式不同,在创建动态库的时候有一些差异。

l  在Windows系统下的执行文件格式是PE格式,动态库需要一个DllMain函数做出初始化的入口,通常在导出函数的声明时需要有_declspec(dllexport)关键字

l  Linux下gcc编译的执行文件默认是ELF格式,不需要初始化入口,亦不需要函数做特别的声明,编写比较方便。

与创建静态库不同的是,不需要打包工具(ar、lib.exe),直接使用编译器即可创建动态库。

本文选自:http://www.cnblogs.com/skynet/p/3372855.html

转载于:https://www.cnblogs.com/luoxiang/p/4168607.html

C++静态库与动态库(简介)相关推荐

  1. linux下生成静态库和动态库

    linux下生成静态库和动态库 一.动态库.静态库简介 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常.本质上 ...

  2. linux静态库与动态库整理

    简化版本 静态库: 制作: gcc -g -c ./*.c -I ../include/ ar crs libmod.a *.o 使用 gcc -g main.c -L ./ -lmod -I ../ ...

  3. 库文件(动态库和静态库)

    1.库文件 通常,我们会在头文件中对类以及函数进行声明,在.cpp源文件中完成具体的实现. 但是这个.cpp文件是对所有人可见的,不具备安全性.保密性,而C/C++提供了一个方法,将这个.cpp源文件 ...

  4. 关于Linux静态库和动态库的分析

    From: http://hi.baidu.com/bdccutysj/blog/item/5bae7f0202abac7c3912bb15.html 1.什么是库 在windows平台和linux平 ...

  5. C/C++ 静态库和动态库的区别

    可执行目标文件 可重定位目标文件 共享目标文件 静态库和动态库的区别: 生效阶段不同,静态库是在编译阶段就会把其链接到可执行目标文件中:动态库是在程序运行过程中指定路径或者系统动态库路径下寻找. -l ...

  6. 静态库与动态库详细剖析

    技术交流QQ群:1027579432,欢迎你的加入! 1.库的介绍 库是什么? 二进制文件: 将源代码(.c或.cpp文件)变成二进制格式的源代码: 加密操作(只能使用,无法知道源代码是什么): 库制 ...

  7. linux 中如何将文件粘贴到usr下的lib内,学会在Linux下GCC生成和使用静态库和动态库...

    一.基本概念1.1什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同(主 ...

  8. C 语言编程 — 静态库、动态库和共享库

    目录 文章目录 目录 文章目录 程序函数库 静态链接 创建静态库文件 动态链接 创建共享库文件 共享库文件的名字 共享库文件的存储路径 LD_LIBRARY_PATH 环境变量 ldconfig 指令 ...

  9. NDK 编译和使用静态库、动态库

    NDK 编译和使用静态库.动态库 情况一:编译静态库 情况二:编译动态库 情况三:编译动态库+静态库 情况四:已有第三方静态库(动态库),编译静态库(动态库) 默认所有代码和文件在$project/j ...

最新文章

  1. php导入excel表格数据,php页面导入excel表格数据-php导入excel 怎么获取excel表格数据...
  2. Quartz Scheduler失火指令说明
  3. Google Guava新手教程
  4. [css] 圣杯布局和双飞翼布局的理解和区别,并用代码实现
  5. 15款精美的 WordPress 电子商务网站模板
  6. 话里话外:参展管理信息化年会 聚会谈咨询需求有市场
  7. python快速示例_python实现快速排序的示例(二分法思想)
  8. java系统性能优化之mysql数据库优化
  9. 计算机考试电子档照片,电子版照片是啥意思???
  10. 朱晔的互联网架构实践心得S1E1:Pilot
  11. __kindof用法
  12. 网页通用的测试用例(出处:: 51Testing-- lxp1119216)
  13. 双足机器人的稳定性判据_双足机器人稳定性判据研究
  14. 什么是你最关键的人脉
  15. 安卓基础学习 Day19|安卓高级控件------下拉列表
  16. 多视图几何学(Multiple View Geometry)读书笔记目录
  17. 裁剪TIF图像,代码简单,易懂(Arcpy)
  18. fatal error: cusparse.h: No such file or directory compilation terminated. error: command ‘/usr/loca
  19. 输入一个日期判断是当年的第几天(C语言)
  20. 围观设计模式(16)--结构型之组合模式(Composite Pattern)

热门文章

  1. thinkPHP5.1.9 vendor 第三方库的使用
  2. MYSQL5.7 忘记ROOT密码/初始化ROOT密码
  3. phpcms 前台模板替换成官网类型的网站
  4. 第三方网站实现绑定微信登陆
  5. mvc HtmlHelper
  6. XSLT 2.0 in .NET
  7. tapable源码分析
  8. 前端开发实习生的第一天
  9. 用电线来传网络信号的黑科技?AirGig究竟是什么
  10. 计算机网络运输层之多路复用与多路分解