文章目录

  • 1. 库
  • 2. 静态库 与 动态库 区别
  • 3. 静态库的创建和使用
    • 静态库的创建和使用的命令
  • 4. 动态库的创建和使用
    • 动态库创建和使用的 命令
  • 5. 让程序找到动态库(三种方法)

1. 库

将自己写的代码封装在一个库中,方便其他人使用并且对代码还有一定的保密作用

库是一种可执行代码的二进制形式,可以被操作系统载入内存执行

Linux 下的库有两种:静态库 和 动态库 (共享库)

库是别人写好的现有的,成熟的,可以复用的代码,你可以使用但要记得遵守许可协议。
现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。动态链接库的名字形式为 “libxxx.so” 后缀名为 “.so


2. 静态库 与 动态库 区别

静态库与动态库被载入的时刻不同

  1. 静态库对函数库的链接是放在编译时期(compile time)完成的
    动态库把对一些库函数的链接载入推迟到程序运行的时期(runtime)

  2. 静态库是在链接阶段,所有相关的目标(对象)文件(object file)与牵涉到的库(library)被链接合成一个可执行文件(executable file)
    动态库是在链接阶段,在目标二进制文件中创建一个库函数表单,指定链接的库函数。

  3. 使用静态库编译,最终生成的可执行文件较大,浪费空间和资源,但执行时与库函数无关,运行速度、调用函数的速度快。
    而使用动态库编译,生成的可执行文件较小,但执行时候需要动态库载入内存,需要去外部调用函数,所以速度较慢

  4. 静态库在软件更新时需要重新去编译成可执行
    动态库 更新时无需重新编译,只需要更改库函数的实现就好了。

  5. 一般静态库的后缀名为.a,静态库的名字之前要加一个lib,静态库的库名一般为lib库名.a
    动态链接库的名字形式为 “libxxx.so” 后缀名为 “.so。
    针对于实际库文件,每个共享库都有个特殊的名字“soname”。在程序启动后,程序通过这个名字来告诉动态加载器该载入哪个共享库。
    在文件系统中,soname仅是一个链接到实际动态库的链接。它是一个指向实际库镜像文件的链接文件。

  6. 动态库可以实现进程之间的资源共享,不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例。可以真正做到链接载入完全由程序员在程序代码中控制。

静态库在程序编译时,会被链接到目标代码中,程序运行时,将不再需要该静态库,因此最终的可执行文件可能会很大

动态库在程序编译时,不会链接到目标代码,而在程序运行时,才被载入,最终生成的可执行文件较小,但在程序运行时,需要有动态库的存在。
——————
共享库的好处是,不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例。


3. 静态库的创建和使用

静态库对函数库的链接是放在编译时期(compile time)完成的。

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

浪费空间和资源,

一般静态库的后缀名为.a,一般静态库的名字之前要加一个lib,所以静态库的库名一般为lib库名.a

静态库的创建和使用的命令

1)生成制作库文件所需的功能函数的可重定向文件gcc ‐c fun.c ‐o fun.o2)生成静态库文件ar crs libfun.a fun.o
lib 表示库文件,一般不能省略
fun 表示库的名字
.a 表示静态库3)静态库生效
gcc main.c ‐o main ‐L. –lfun
‐L 指定库的路径
‐l 指定库的名字

4. 动态库的创建和使用

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

可以实现进程之间的资源共享。

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

甚至可以真正做到链接载入完全由程序员在程序代码中控制。

动态链接库的名字形式为 “libxxx.so” 后缀名为 “.so

针对于实际库文件,每个共享库都有个特殊的名字“soname”。在程序启动后,程序通过
这个名字来告诉动态加载器该载入哪个共享库。

在文件系统中,soname仅是一个链接到实际动态库的链接。

对于动态库而言,每个库实际上都有另一个名字给编译器来用。它是一个指向实际库镜像文件的链接文件。这个时候soname是没有版本号的。

动态库创建和使用的 命令

1)生成制作库文件所需的功能函数的可重定向文件
gcc ‐fPIC ‐c fun.c ‐o fun.o‐fPIC  生成与位置无关的代码(生成的动态库文件在内存上  可以自动寻找一块合适的内存区域)2)生成动态库文件gcc ‐shared fun.o ‐o libfun.so.so  表示动态库文件3)将动态库复制到/lib目录里面sudo mv libfun.so /lib4)使用
gcc main.c ‐o main ‐lfun

5. 让程序找到动态库(三种方法)

  1. 把库拷贝到/lib目录下
  2. LD_LIBRARY_PATH环境变量中加上库所在的路径
  3. 添加/etc/ld.so.conf.d/*.conf文件,把库所在的路径加到文件末尾,执行idconfig刷新,这样,加入的目录下的所有库文件都可见。

动态库、静态库的创建及使用相关推荐

  1. linux库引入之动态库静态库(生成和使用)

    库: 库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.就是将源代码转化为二进制格式的源代码,相当于进行了加密,别人可以使用库,但是看不到库中的内容. 如何使用 用户需要同时具有头文件和库. ...

  2. c语言makecode头文件,cmake 添加头文件目录,链接动态、静态库

    罗列一下cmake常用的命令. CMake支持大写.小写.混合大小写的命令. 1. 添加头文件目录INCLUDE_DIRECTORIES 语法: include_directories([AFTER| ...

  3. linux系统应用学习(三)--- 动态库静态库

    动态库静态库 库文件:一般指第三方提供的可调用的库函数文件,库文件封存的是函数体,即.c文件里面的内容. 动态库      静态库 Windows下:        xx.dll            ...

  4. linux库--静态库、动态库

    文章目录 一.分文件编程思想 二.动态库静态库 1.概念介绍 2.静态库的制作和使用 3.动态库的制作和使用 一.分文件编程思想 好处: 分模块的编程思想 例如: 网络 a 超声波b 电机c a.功能 ...

  5. VS2015编译32位Opencv310(动态库+静态库,文末有下载链接)

    VS2015编译32位Opencv310(动态库+静态库 编译过得,可以直接用的: http://download.csdn.net/download/longzaihuaxia/9802510 之前 ...

  6. CMake 添加头文件目录,链接动态、静态库(添加子文件夹)

    CMake支持大写.小写.混合大小写的命令. 当编译一个需要第三方库的项目时,需要知道: 去哪找头文件(.h),-I(GCC) INCLUDE_DIRECTORIES() 去哪找库文件(.so/.dl ...

  7. cmake中添加引用动态链接_CMake 添加头文件目录,链接动态、静态库(添加子文件夹)...

    CMake支持大写.小写.混合大小写的命令. 当编译一个需要第三方库的项目时,需要知道: 去哪找头文件(.h),-I(GCC) INCLUDE_DIRECTORIES() 去哪找库文件(.so/.dl ...

  8. 硬核拆解动态库静态库

    [Github pages] 动态库与静态库是编程中十分常见的玩意儿,但是如此常见的东西在我真正用心去了解梳理过一遍之后才发现原来这里面有这么多的门道.本文就介绍一波 Linux 平台下,特指 GCC ...

  9. Qt动态库静态库的创建、使用、多级库依赖、动态库改成静态库等详细说明

    本文描述的是windows系统下,通过qtcreator在pro文件中添加动态库与静态库的方法: 1.添加动态库(直接添加动态库文件.dll,非子项目) 通过qtcreator创建动态库的方法就不在此 ...

  10. 使用Visual Studio来创建动态库/静态库,并加载

    使用Visual Studio来创建动态库 第一步新建一个控制台程序 第二步去掉SDL安全开发周期,以及选中创建DLL空项目 在资源管理器中添加.h和.cpp文件 在.h文件里可以写上函数的声明: # ...

最新文章

  1. C语言求cidr,求诸位大师解答一个关于CIDR地址划分的问题
  2. qq传java文件_java学习:基于TCP的网络文件传输(可改写的QQ文件传输)
  3. GPUImage源码解读之GPUImageFramebuffer
  4. UnicodeDecodeError: 'gbk' codec can't decode byte 0xab in position 43: illegal multibyte sequence
  5. iTerm2多个窗口同时输入命令
  6. smart filter无法从smart business应用获得值的问题分析
  7. 移动机器人综合性能对比分析
  8. 你写得API接口代码真是一坨屎,难道不能对返回格式统一处理一下吗?
  9. Java-图书管理系统(控制台程序)
  10. 单招软件职业技能测试,高职单招职业技能测试,这些知识你都了解吗?
  11. linux下QQ配置文件路径,Linux下QQ的使用并手动设置QQ文件保存路径
  12. 百度推广技巧:如何提高网站点击率?
  13. Django发送电子邮件
  14. python学生成绩管理系统【完整版】
  15. 关于Prim算法,自己的一些总结
  16. 新玺配资:股票市场中的配股是什么意思
  17. setTimeout()的用法
  18. 安装包UI美化之路-在线安装包
  19. 记录一次工作中的问题以及解决(POI对于Excel的数据导出覆盖问题)
  20. 循环卷积的时域DFT性质推导

热门文章

  1. 双系统安装Win10 与 Ubuntu,开机直接进入win10不能进入 Ubuntu系统解决办法
  2. OpenCV——边缘检测原理
  3. Exchange 交换机详解
  4. 智能电动车 太得瑟只会被抛弃
  5. 搜索不到投屏设备怎么办_乐播投屏出现搜索不到设备的具体解决方法
  6. php判断小数点的长度_PHP怎么判断获得的数是否为小数
  7. Wordpress自媒体主题:JustNews 5.7.2(113p.cn)
  8. python常用 标准库介绍
  9. 配置inotify实现实时同步
  10. 大学3年身家已逾500万