专栏首页秘籍酷C语言(库的故事)

C语言(库的故事)

我不种田来不种菜,不下海来不钓鱼,不会织布不裁衣,不会行医不问药,这些跟我的生存状态密切相关的技能统统不会,按理我就该饿死、馋死、冻死、病死,反正各种死,但明显我还活着,这就给今天的扯蛋留下了谈资。

上述神迹发生的原因很简单,因为我们的社会极大分工,而不是像原始社会那样自给自足。我们每个人都做一个极小领域的细活,然后在一个大系统中大家彼此依赖,每个人的专注专业加速了细分领域的效率,而协同合作又节省了大家的成本和时间,最终大家都相互受益。

这种极大减少了低效重复劳动的做法,在编程世界里面,也是必须遵循的基本原则。而这些编写出来可以被重复使用的软件模块,就是库文件。在Linux下常见的是后缀为 .a 或者 .so 的文件,在Windows下常见的是后缀为 .dll 的文件。

下面就Linux系统,简单谈谈库的来龙去脉。假设有代码 wrap1.o 和 wrap2.o,将他们做成不同的库文件:

  1. 静态库制作方法: ar rcs libx.a wrap1.o wrap2.o
  2. 动态库制作方法: gcc -shared -fPIC -o liby.so wrap1.o wrap2.o

从上面的操作看到,库文件其实都是由一堆 *.o 文件组成的集合,当我们要用到这些代码的时候,就可以不必链接这些 *.o 文件或者其源文件,而只需要链接库文件即可,比如:

gcc main.c -o main -L ./lib -lx gcc main.c -o main -L ./lib -ly

上面的例子,就是链接了 libx.a 或者 liby.so,注意,库的名字是除去前缀 lib 和后缀之后的名字。

既然有静态库和动态库,那么他们有什么区别呢? 答案很简单,静态库相当于卖书的书店,动态库相当于看书的图书馆。他们各自有各自的优缺点:

书店的优点:

  1. 将书买回家,以后书店就算火灾也不影响你看书
  2. 想看书的时候,拿起来就看,而不必跑到书店去

书店的缺点:

  1. 每个人都把自己想要的书买回家,一千个人就要一千个拷贝
  2. 书出了新版,也跟你无关,除非你再买一次

完全相对应地,来看看图书馆的情况。

图书馆的优点:

  1. 每个人都在馆里看书,一千个人也可以同时看一本书
  2. 有了新版的书,你可以随时查看,只要书的名字没变

图书馆的缺点:

  1. 突然有一天着火了,你再也无法看书了
  2. 想看书的时候,得跑一趟图书馆,需要花一点时间

上面的几个优缺点相互权衡后你会发现,节省图书拷贝,减少重复代码是最关键的地方,因此动态库(图书馆)就比静态库(书店)更具优势。所以你会看到动态库用的更多。另外再补充一点,因为动态库编译之后,你并没有将代码拷到你的程序里,而是等到你程序运行的时候,才又来找到动态库执行所需代码。就像你去图书馆浏览了一遍目录,找到你需要的书,你并不会带走,而只是心里有底了,下次来的时候还是要找到这本书才能看。

因此,运行一个连接动态库的程序,一般要设置环境变量LD_LIBRARY_PATH来告知系统动态库的具体位置,好让运行时能找到它。另外一种办法是编译时就告诉系统以后运行时动态库的位置。比如上述的例子,可以写成:

gcc main.c -o main -L ./lib -ly -Wl,-rpath=./lib

本文分享自微信公众号 - 秘籍酷(mijiku040),作者:林世霖

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-05-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C语言(一个真实的故事)

    曾经有一个简单又不失牛逼的小技巧,老师教的时候我没有珍惜,等到同事因为用了这个技巧升任总工才后悔莫及,如果上天再给我一次机会,我会对老师说:我要学!如果非要定个...

    用户2617681
  • 非局部静态数据在多编译单元中的窘境

    而编译单元指的就是*.o文件,假如一个工程是由n个单独的cpp和对应的头文件,那么就会被事先编译生成n个*.o文件,有时候我们将这些*.o文件称为目标文件,它们...

    用户2617681
  • C语言(支持插件的软件实现原理)

    平常使用的库文件分为静态库和动态库,而用的最多的动态库还分为静态联编和动态加载两种方式,所谓的动态加载就是插件式管理动态库,是非常实用的技术。

    用户2617681
  • ubuntu 安装 Jupyter Notebook

    pip3 install jupyter --user .. The scripts jupyter-bundlerextension, jupyter-...

    iOSDevLog
  • AVFoundation框架解析看这里(7)- AVAssetImageGenerator

    AVAssetImageGenerator,用来提供视频的缩略图或预览视频的帧的类。在很多视频软件中,基本都会提供跟随鼠标进度显示画面,裁剪视频时预览关键帧等功...

    sweet说好的幸福
  • 三大浏览器敦促网站管理员更换 SHA–1 认证

    继去年宣布了SHA–1弃用计划之后,近期Google、Microsoft和Mozilla给出了从各自的旗舰浏览器产品中移除SHA-1认证支持的详细时间表。

    Debian中国
  • 闭包(Closures)函数/表达式

    在其他语言中,闭包函数也可能叫代码块(blocks)或者匿名函数(lambdas)。

    gojam
  • 每天一道面试题(20)

    你如何理解AOP中的连接点(Joinpoint)、切点(Pointcut)、增强(Advice)、引介(Introduction)、织入(Weaving)、切...

    剑走天涯
  • 【可视化】中国共享经济发展全景图!

    共享经济已经不经意间占领了人们生活的方方面面。 或许我们不用等到里夫金所说的共享经济取代资本主义的2050年,就能够看到共享经济在中国颠覆了传统的商业模式。现在...

    钱塘数据
  • Django2.1发布,Django2.1新特性

    Django 2.1 现已正式发布,官方表示随着 2.1 的发布,对 2.0 系列的主流支持服务将结束,进入安全修复服务周期,直至2019年4月。

    程序员同行者

扫码关注云+社区

领取腾讯云代金券