库的定义r
r
库文件是一些预先编译好的函数的集合,那些函数都是按照可再使用的原则编写的。它们通常由一组互相关联的用来完成某项常见工作的函数构成,从本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。r
r
无论在Wi
dows平台还是Li
ux平台下都存在大量的库,但由于Wi
dows和Li
ux的本质不同,因此二者的库的二进制是不兼容的。r
r
库的分类r
r
Wi
dows下的库有两种:静态库lib和动态链接库dll。r
r
Li
ux下的库有两种:静态库a和共享库so。r
r
Li
ux下的静态库的名字一般为libxxxxa,其中xxxx是该lib的名称r
r
Li
ux下的动态库的名字一般为libxxxxsomajormi
or,xxxx是该lib的名称,major是主版本号,mi
or是副版本号。r
r
Wi
dows下的库与Li
ux下的库的异同r
r
Li
ux的共享库so就象Wi
dows的动态链接库dll,它里面包含有很多程序常用的函数。为了方便程序开发和减少程序的冗余,程序当中就不用包含每个常用函数的拷贝,只是在需要时调用共享库中常函数即可。这种方式我们称之为动态链接Dy
amicallyLi
ked。而有时我们不希望叫程序去调用共享库的函数,而是把库函数代码直接链接进程序代码中,也就是说,在程序本身拥有一份共享库中函数的副本。这种方式我们称之为静态链接(StaticallyLi
ked)。r
r
所以,简单的讲静态库和共享库动态库的不同点在于代码被载入的时刻不同。r
r
静态库的代码在编译过程中已经被载入可执行程序,因此体积较大。r
r
共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。r
r
Wi
dows下的动态链接库dll与Li
ux下的共享库so的差别r
r
dll文件事实上和exe文件一样,同属PE格式的执行文件。对于隐式的引用外部符号,需要把外部符号所在的位置写在PE头上。PE加载器将从PE头上找到依赖的符号表,并加载依赖的其它dll文件。r
r
而在Li
ux上并非如此!so文件大多为elf执行文件格式。当它们需要的外部符号,可以不写明这些符号所在的位置。也就是说,通常so文件本身并不知道它依赖的那些符号在哪些so里面。这些符号是由调用dlope
的进程运行时提供的。r
r
我们在Wi
dows下做一个dll文件时还需要携带一个lib文件;而在Li
ux下一般只需要有相应的头文件就够了。对于编写新的so,找不到的符号可以就让它在那里,直到最终执行文件来把所有需要的符号联合到一起。wi
dows可以存在一个dll对另一个dll的隐式依赖;而Li
ux下一般不需要让so和so有隐式依赖关系。r
r
通过上文介绍,大家对库的概念有了一定的了解,知道了Li
ux与Wi
dows系统下的库的r