Linux与Windows系统下的库比较

系统 Linux
库提供一些可以给别的程序调用的东西,别的程序要调用它必须以某种方式指明它要调用之。所以本文章对比Linux和Windows来介绍下库,让大家认识,并掌握他。

库的定义

    库文件是一些预先编译好的函数的集合,那些函数都是按照可再使用的原则编写的。它们通常由一组互相关联的用来完成某项常见工作的函数构成,从本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。

无论在 Windows 平台还是 Linux 平台下都存在大量的库,但由于Windows和Linux的本质不同,因此二者的库的二进制是不兼容的。

库的分类

Windows下的库有两种:静态库(.lib)和动态链接库(.dll)。

Linux下的库有两种:静态库(.a)和共享库(.so)。

Linux下的静态库的名字一般为libxxxx.a,其中xxxx是该lib的名称

Linux下的动态库的名字一般为libxxxx.so.major.minor,xxxx是该lib的名称,major是主版本号,minor是副版本号。

Windows下的库与Linux下的库的异同

    Linux 的共享库(.so)就象Windows的动态链接库(.dll),它里面包含有很多程序常用的函数。为了方便程序开发和减少程序的冗余,程序当中就不用包 含每个常用函数的拷贝,只是在需要时调用共享库中常函数即可。这种方式我们称之为动态链接(Dynamically Linked)。而有时我们不希望叫程序去调用共享库的函数,而是把库函数代码直接链接进程序代码中,也就是说,在程序本身拥有一份共享库中函数的副本。 这种方式我们称之为静态链接(Statically Linked)。

所以,简单的讲静态库和共享库(动态库)的不同点在于代码被载入的时刻不同。

静态库的代码在编译过程中已经被载入可执行程序,因此体积较大。

共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。

Windows下的动态链接库(.dll)与Linux下的共享库(.so)的差别

    .dll文件事实上和.exe文件一样,同属 PE 格式的执行文件。对于隐式的引用外部符号,需要把外部符号所在的位置写在PE头上。PE加载器将从PE头上找到依赖的符号表,并加载依赖的其它.dll文件。

    而在Linux 上并非如此!.so文件大多为elf执行文件格式。当它们需要的外部符号,可以不写明这些符号所在的位置。也就是说,通常.so文件本身并不知道它依赖的那些符号在哪些.so里面。这些符号是由调用dlopen的进程运行时提供的。

    我们在Windows下做一个.dll文件时还需要携带一个.lib文件;而在Linux下一般只需要有相应的头文件就够了。对于编写新的.so,找不到的 符号可以就让它在那里,直到最终执行文件来把所有需要的符号联合到一起。windows 可以存在一个.dll对另一个.dll的隐式依赖;而Linux下一般不需要让.so和.so有隐式依赖关系。

通过上文介绍,大家对库的概念有了一定的了解,知道了Linux与Windows系统下的库的不同,希望大家在学习和工作中能多对Linux进行深一步了解。

【编辑推荐】

  1. 简单叙述linux windows区别
  2. 因用户不习惯Linux Windows上网本后来居上
  3. 详述三种Linux windows双系统共存问题
  4. Linux文件系统知识大揭秘
  5. Linux Kernel 2.6.37发布 Ext4性能提升
  6. 微软宣布下一代Windows支持ARM处理器
  7. Windows 7安全性需要你知道的五件事
  8. 带您了解SQL Sever数据库文件
  9. 3.4 Flex库文件SWC

 

 

责任编辑:赵鹏
相关推荐

2010-04-28 17:46:19

2019-12-17 08:39:21

Linuxwindowsoracle

2009-07-03 12:05:14

2010-05-12 15:34:26

MySQL编码设置

2014-08-14 17:11:51

LinuxWindows

2017-04-13 13:00:27

LinuxWindowstomcat

2011-09-08 09:46:29

ubuntuMySQL

2012-07-13 15:29:49

2011-01-10 15:55:20

LinuxWindowsWine

2017-09-12 14:14:05

2016-11-25 20:52:14

Linux

2011-03-31 11:03:51

系统迁移

2021-12-25 23:25:04

LinuxDocker容器

2012-08-27 13:20:00

CentosUbuntu

2011-08-19 09:21:42

2009-03-18 08:50:59

LinuxWindows系统目录

2009-12-31 09:22:36

2010-01-04 09:33:03

2016-11-11 13:07:18

LinuxWindows设备驱动模型

2012-11-05 09:46:17

路由器操作系统浏览器
点赞
收藏

51CTO技术栈公众号