Chinaunix

标题: 各种恶心的“库”,大家一起来辨别和解释区分 [打印本页]

作者: dxyf1524    时间: 2013-07-12 14:08
标题: 各种恶心的“库”,大家一起来辨别和解释区分
本帖最后由 dxyf1524 于 2013-07-12 16:15 编辑

最新看书,看到了各种关于库的名词,即我们常说的libraries,发现了好多种说法,我自己都迷糊了,大家一起讨论吧

库————————(libraries)
静态库——————(statical libraries)
共享库——————(shared libraries)
动态链接库——————(Dynamic link libraries)
动态加载库———————(Dynamic load libraries)

还有就是 共享库的“隐式调用”和“显示调用”。
这跟静态加载和动态加载有什么区别啊,难道是一样的?

大家说出自己的理解吧,最好能给出一些应用的情形或者有关链接和加载时理解

##############
PS:最好讨论C的,平台最好是linux,ELF文件格式
###############

更正一些理解:

(1)动态链接与静态链接
(2)静态链接库(静态库)与动态链接库(共享库,动态加载库)
(1)和(2)的联系不是太大,(1)是动作,(2)是名词
(1)和(2)可以合理搭配
比如可以有静态链接共享库,动态链接共享库,至于动态链接静态库可能就错了,
因为静态链接发生在生成目标代码的过程中,而动态链接发生在加载程序进内存后,动态链接器链接共享库,
至于动态加载库,是应用程序调用的系统动态链接器的函数,执行与动态链接器链接一般共享库一样的过程;

这里我有些疑问,操作系统使用的共享库或者说应用程序使用的操作系统的库都是怎样加载或者什么时候加载进来的??
迷糊了,我的问题都是迷糊的?求指正

再次更正理解:
我觉得静态库和动态库都是共享库??
作者: cxytz01    时间: 2013-07-12 14:56
我的理解,不一定对
库————————(libraries)                                           --所有下面的总称(除了动词)
静态库——————(statical libraries)                               -- 编译时被链接入二进制代码中, libxxx.a就是静态库
共享库——————(shared libraries)                               -- 不清楚,所有的库都是共享的吧?
动态链接库——————(Dynamic link libraries)                 -- 这是一个名词,而不是一个动词。  libxxx.so就是动态链接库
动态加载库———————(Dynamic load libraries)             -- 这是一个动词,而不是名词。    应该就是显示调用dllopen

还有就是共享库的“隐式调用”和“显示调用”。
这里就说下动态库的隐式调用和显示调用,但不说共享库的隐式调用和显示调用。 共享库是什么?库应该都是共享的吧?
1.隐式调用,gcc 1.c -lpthread -lm   --编译时链接
        然后代码里面直接用库函数,pthread_create...
2.显示调用,gcc 1.c
        代码里面如果想使用pthread_create,应该使用dllopen打开libpthread.so,dlsym获取pthread_create函数的指针,才可以使用

这跟静态加载和动态加载有什么区别啊,难道是一样的?
1.个人觉得静态加载就是隐式调用的编译时链接
2.动态加载就是显示调用的dllopen

作者: dxyf1524    时间: 2013-07-12 15:50
静态库是编译器链接的时候确定静态库的地址,静态库载入到了目标文件。
在执行的时候,多个应用程序无法同时使用同一个静态库代码段,而且加载静态库就是伴随目标代码一起加载,静态库此时就像一个代码段一样
共享库应该至少是在程序加载的时候由链接器分析加载的目标代码所需要的库,此时连接器会导入共享库(如果从前系统没有导入过,
如果导入过,则可以进行共享,一般通过虚拟内存的管理接口实现)
而动态加载库虽然也是共享库,但是他比共享库多了一些东西,稍微复杂,就是在程序编译的时候连接器似乎不知道我们加载的共享库
在程序执行的时候,通过系统提供的接口载入一个外部共享库,此时我们调用的载入程序会处理一系列的链接和载入问题。
总的来说,就像我们写程序时写道{fopen(“hello.txt”)}编译器在编译完程序的时候,是不会搭理这个文件的,直到我们的程序执行到那了
“隐式调用”和“显示调用”我目前还没看到英语文献中有类似说法(知道的,一定要告诉我啊)。
国内的显示调用差不多等价于我们说的库的动态链接(这里也应该有动态加载的过程),隐式调用
给我的感觉就是我自己写了一个m.c和m.h,,m.h声明了函数和变量,实现的时候在m.c,然后就想m.c编译成了
静态库,使用的时候和不编译成静态库一样,直接#include“m.h”。
也许编译的静态库和不编译成库代码会有区别么??
求指点和批评


作者: aychxm    时间: 2013-07-12 16:22
有本叫做 程序员的自我修养 ,介绍的挺好
作者: dxyf1524    时间: 2013-07-12 16:47
回复 4# aychxm

有机会会去读,目前我还太菜,基本的东西还需理解,概念都十分模糊
   
作者: lxyscls    时间: 2013-07-12 17:40
什么叫有机会?
什么时候有机会?{:3_188:}




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2