引言

我们在编写代码时,常常会写一个.c源文件和与之对应的.h文件(例如a.c和a.h),并在源文件.c中定义(具体实现)一些函数,在.h文件中声明, 这样我们就可以在其他源文件中包含该头文件,来调用之前写的函数,这样做的好处就是避免了重复劳动,同时也可以调用一些大神的代码。 但是有时候我们不想公开自己的源代码(.c),尤其是商业性代码,同时又要让客户能够使用他们编写的代码,解决的方法就是打包成静态链接库(.a,.lib)或动态链接库(.so, .dll),同时提供对应的头文件.h, 譬如我们经常使用的stdio.h , string.h等C库函数,这些统称为函数库, 那么我们今天就来聊聊什么是函数库,函数库有什么作用,如何制作函数库等等话题。

什么是函数库

函数库就是一些事先写好的函数集合。 因为函数是模块化的,不同的功能封装成一个个不同的函数,可以是被反复调用,当A写好了一个功能函数,然后共享出来,此时B 有同样的需求就不用自己重写实现该功能了,直接调用A写的函数即可,避免了重复劳动。 而且由于共享免费的原因,这些函数会经过很多人测试使用,并不断优化,其可靠性是非常之高的,最终形成标准,譬如glibc。

函数库的提供形式

目前函数库主要的提供2种形式:动态链接库和静态链接库。

比较早出现的是 静态链接库,其实质是商业公司或个人将自己的函数库源代码经过只编译不链接,形成各个.o目标文件,然后用ar(gcc中 binutils 工具集,主要用来创建和管理连接程序使用的目标库文档)工具将各个.o(windows下.obj)文件归档成.a(或.lib),即静态链接库文件,然后通过发布.a库文件和.h头文件来提供静态库给他人使用,而其他人则通过.h头文件得知库中的库函数原型,然后在自己的.c文件中直接调用这些函数,并且在编译链接时,链接器(ld)会去.a文件中拿出被调用的哪个函数编译后的.o二进制代码段链接形成最终的可执行程序。这就是静态链接库的原理。

动态链接库比静态链接库出现的晚一些,那么动态链接库和静态链接库有什么区别呢? 静态库是指链接器从静态链接库获取所有被引用函数,并将这些函数加入到可执行文件中。这样做的好处是代码装载速度快,但是缺点很明显可执行文件体积较大,包含相同的公共代码,造成浪费。而动态链接库呢,避免了重复加载相同的代码块,因此更节省空间,但是其本身程序是不完整的,在整体运行速度比静态库慢。 我们通过一个简单的hello world例子来感受下:

#include int main(void){printf("hello world.");return 0;}

我们调用glic库中stdio中的printf函数,打印hello world, 然后我们编译运行(这里我们不加任何参数选项,即默认使用动态链接的方式),并通过ls -l命令查看编译生成的可执行文件a.out的文件大小:8.4K

接着我们在通过参数选项(-static),指定使用静态链接方式再次编译,看看此时可执行文件a.out的文件大小:891K

两者方式都成功运行了“hello world”,但使用静态链接方式得到的可执行文件远远大于使用动态链接库方式。

静态链接方式中,在有多个应用程序都使用了这个库函数时,结果会在多个应用程序最后生成的可执行程序中都各自有一份这个库函数的代码段。当这些应用程序同时在内存中运行时,实际上在内存中有多个这个库函数的代码段,这完全重复浪费了。而动态链接库本身不将库函数的代码段链接入可执行程序,只是做个标记。然后当应用程序在内存中执行时,运行时环境发现它调用了一个动态库中的库函数时,会去加载这个动态库到内存中,然后以后不管有多少个应用程序去调用这个库中的函数都会跳转到第一次加载的地方去执行(不会重复加载)。

总结

今天我们主要分析了函数库的概念,以及2种表现方式:动态链接库和静态链接库,并介绍了两者的区别,以及如何使用静态库来编译我们的代码。之后我会讲解如何不同平台下(gcc, keil armcc下)制作我们自己静态和动态链接库,方便大家将自己的代码共享给别人,同时也能保护自己的知识产权。好了,今天的分享到此,喜欢的话欢迎关注,转发加收藏哦~

keil lib 只调用自己的函数_C语言学习篇(28)——函数库相关推荐

  1. python文件定位函数_C语言中文件定位函数总结

    C语言中文件定位函数主要是:fseek, ftell, fsetpos, fgetpos. 先来讲前两个函数,这是最基本的定位函数: fseek函数:能把文件指针移动到文件任何位置,其原型是:int ...

  2. c语言回调函数_C语言学习第26篇---函数与指针分析 回调函数

    函数类型的概念 1.C语言函数也是有类型的 2.函数类型由函数返回值,参数类型,参数个数共同决定 int add(int i,int j) 的类型是 int(int , int) 3.C语言中通过ty ...

  3. bazel 链接第三方动态库_C语言学习篇(31)——linux中制作动态链接库

    引言 前面我们讲解了什么是函数库(函数库就是一些事先写好的函数集合),函数库有什么作用(可以打包我们的编写的源代码,供他人使用,同时源码不可见,保护了自己的知识产权)以及函数库有2种提供方式:静态链接 ...

  4. java实现c语言的函数_C语言实现返回字符串函数的四种方法

    前言 C语言返回字符串函数共有四种方式,分别如下: 使用堆空间,返回申请的堆地址,注意释放 函数参数传递指针,返回该指针 返回函数内定义的静态变量(共享) 返回全局变量 下面来看看详细的介绍 其实就是 ...

  5. c语言遍历文件内容_C语言学习第28篇---动态内存分配剖析

    为什么C语言要动态分配内存的意义? 1.C语言中的一切操作都是基于内存的 2.变量和数组都是内存的别名 ---内存分配由编译器在编译期间决定的 ---定义数组的时候必须指定数组长度 ---数组长度是在 ...

  6. c语言谭浩强ppt课件,编程_C语言学习课件_谭浩强_PPT~1216F.ppt

    编程_C语言学习课件_谭浩强_PPT~1216F.ppt ,第一章,C语言概述本章要点,C语言的特点 C程序的结构 在计算机上运行C程序的方法主要内容,1.1 语言出现的历史背景 1.2 程序的特点 ...

  7. Python语言学习:复杂函数(yield/@property)使用方法、案例应用之详细攻略

    Python语言学习:复杂函数(yield/)使用方法.案例应用之详细攻略 目录 yield 1.生成斐波那契數列 @property 其他函数 yield 带有 yield 的函数在 Python ...

  8. C语言学习之路--函数,从知识到实战

    目录 一.前言 二.函数是什么? 三.C语言中函数的分类 1.库函数 1.为什么会有库函数? 2.如何学习库函数? 3.学习库函数举例 1.strcpy 2.memset 3.库函数学习工具总结 2. ...

  9. c 语言 内部函数与外部函数,C语言-内部函数与外部函数.doc

    C语言-内部函数与外部函数 吩算彭毙摊鬼笺选瓦瑞疡呐缴识曹研酥腹怕语透逆谓撮渴聋脐壤本精俄漏煎电米履详醋捐丧减掩敷挣煮阜祖锁锨溃睹喉爪冯耍缀示瞎嘴允戏馅径俊窗嚣节愈娶涩睡给峪凄灼助凝棍妻凌瞬诵攻枝溜甥 ...

最新文章

  1. Linux查看文件大小的几种方法
  2. 【OpenCV3】模板匹配——cv::matchTemplate()详解
  3. 小心VB.NET中的除运算符/和/
  4. dropbox解决办法
  5. 设计和实时视图不一样_新宝骏“星际几何”设计理念,演绎不一样的跨界融合...
  6. java sqlmap_sqlmap 学习指南
  7. 如何将电子海图的航线导到gps上_电子海图(ECDIS)使用总结
  8. oVirt guest | VM HOST HA in one Cluster
  9. 01.mac下安装配置maven
  10. 关于Initializing Spring root WebApplicationContext解决方法
  11. Python数据的精度
  12. zai php 里面写js,php中写入js代码
  13. android 刷机 3e,华为nova 3e官方出厂固件rom刷机包下载_nova3e完整版升级包
  14. win7系统如何恢复或重装IE8浏览器呢?
  15. 【系统优化】解决windows11桌面切换卡顿(非重装以及关闭特效)
  16. win7如何用双显示屏,如何设置
  17. java while语句打印三角形_java基础之五小节带你走进java流程控制—多重循环
  18. 只需要MTK工程的bin文件、手机和下载线便可以修改各种手机软件
  19. truetype字体怎么转换成普通字体_TrueType字体作用|如何在文档嵌入 TrueType 字体中...
  20. 西电捷通TISec解决方案保障配电网通信安全

热门文章

  1. 【Vue学习第三天】组件的使用
  2. 在非activity类调用startActivityForResult
  3. 分离Exchange的OWA和Microsoft-Server-Activesync手机访问
  4. maven发碰到的问题
  5. ios 自定义UIView绘制时文字上下颠倒问题解决
  6. [转载]Windows SDK笔记
  7. Tasklets 机制浅析
  8. PAT甲级1049 Counting Ones (30 分):[C++题解]统计1的个数、数位统计
  9. 几个关于财报的基本知识
  10. sendto 返回errnor 1,错误码1 Operation not permitted