2014百度校招笔试题之动态链接库&静态链接库详解

转载自:http://blog.csdn.net/longshengguoji/article/details/12206785

静态库:编译时候加载连接需要的函数和类文件集成到.exe/.so中,不能动态升级,运行时代码装载速度快,执行速度略比动态库快。

动态库:分为静态调用和动态调用,静态调用程序开始运行时候加载所有需要用到的文件,启动慢点,调用方便。动态调用,程序运行起来以后才根据需要加载需要的函数,调用复杂点,程序启动快。

一般应用中对库内容用的很多的用静态库,对库内容用得少但对函数用得频繁的用动态库静态调用,对库内容用得少但不频繁调用函数的用动态库动态调用即可

要求组件式架构的,便于升级都应该使用动态库, 一般用静态调用就可以了,比较方便。

对于安装程序大小不是很在乎的,非组件式架构的,用静态库即可。

boost库:


还有人总结windows下boost库的命名特点:

link=static runtime-link=static 得到 libboostxxxxx.lib 
link=shared runtime-link=shared 得到 boostxxxx.lib 和 boostxxxx.dll

shared应该都是动态库,静态调用,如果动态调用那是很多函数地址和函数指针都不知道无法操作的,故runtime-link解释为 内部的连接最合适了。

一般一种库只用一种连接方式,所以编译时候用static或者shared即可,但是shared中是否要用户也安装dll,所以静态static应该是最安全的。

由以上的文件夹层次结构基本就可以得出结论: 
1、以“lib”开头的是“link-static”版本的,而直接以“boost”开头的是“link-shared”版本的。 
2、有“d”的为debug版本,没有的则是release版本。 
3、有“s”的为“runtime-link-static”版本,没有的则是“runtime-link-shared”版本。 
4、有“mt”的为“threading-multi”版本,没有的则是“threading-single”版本。

也有说:

那么,link指的是client->A,runtime-link指的是A -> B

runtime-link refers to how your compiler's runtime is linked. That is, it corresponds to VC's Multithreaded vs. Multithreaded(但是有threading=single|multi选项) DLL option. Runtime means the components required for using the standard libraries available with your compiler.


1.什么是静态连接库,什么是动态链接库

        静态链接库用通俗的话讲,静态库就是将代码编译到一个二进制文件下(通常扩展名为.LIB).然后客户端调用程序,只需要包含相关的.h文件及LIB库文件一起链接到exe文件中.可执行程序发布后,不再需要该.lib文件了.

动态链接库最终将编译出.lib与.dll文件. 注意.lib文件与上面的静态库虽然扩展名相同,但有本质的区别.动态库中的lib文件是动态库的引入库. 该引入库包含被DLL导出的函数和变量的"符号  名".而静态库中的.lib包含了函数和数据,动态库的函数和数据是编译到.dll中.动态链接库调用方式分为隐式调用与显示调用(也称静态调用与动态调用)。

2.动态链接库与静态链接库的使用时机

2.1用动态库的时机:

1)大系统,开发组多.减轻Build的负担。

2)不同语言版本的资源。数据/代码分离。

3)模块可以适应很多程序使用,而且程序可能安装到同一个系统中。比如IE 与 Outlook 会共用很多Dll.

1) 2)是工程管理的需要,3)是节省空间的需要。

但是Dll也会造成浪费,每个Dll的基本代码(例如内存管理等C runtime)是相同的。所以如果库比较小,还是使用LIB比较好。

动态库的应用有两个主要原因:
1、共享。多个程序可以使用同一个动态库
2、开发模式好。要求设计者对功能划分得更好
但动态库装载的时候慢,特别是运行中装载有明显延迟。一旦装载完毕执行起来根静态库比较慢不了。

2.2静态库的优点:

代码装载速度快,执行速度略比动态库快。

3.动态链接库和静态链接库的使用

3.1对于动态链接库:

动态链接库的使用,根据不同的调用方法,需要提供不同的资源:

1. 静态加载------程序静态编译的时候就静态导入dll,这样的话就需要提供给库使用者(C客户)如下文件:*.lib文件和.dll文件和*.h。其有2个坏处:

1   程序一开始运行就需要载入整个dll,无法载入程序就不能开始运行; 
2   由于载入的是整个dll,需要耗费资源较多

其调用方法如下:

#include"..\lib.h"
#pragma comment(lib,"..\\debug\\libTest.lib")

 但是这种方式的话可以调用Classmethod.

2.动态加载-----那么只需要提供dll文件。

因此调用程序若想调用DLL中的某个函数就要以某种形式或方式指明它到底想调用哪一个函数。但是无法调用Classmethod了。
如果要调用Dll中的function,需要经历3个步骤:
Handle h=LoadLibrary(dllName) --> GetProcAddress(h,functionName) 返回函数指针,通过函指针调用其function-->FreeLibrary(h)
例如:Another.dll有一个intAdd(int x,int y)函数。则完整的调用过程如下:
typedef int (* FunPtr)(int,int);//定义函数指针
FunPtr funPtr;
Handle h=LoadLibrary("Another.dll");
funPtr=(FunPtr)GetProcAddress(h,"Add");
funPtr(2,3);//2+3;
FreeLibrary(h);

 

3.2对于静态链接库:

首先,静态链接库的使用需要库的开发者提供生成库的.h头文件和.lib文件。

生成库的.h头文件中的声明格式如下:

extern "C" 函数返回类型 函数名(参数表);

在调用程序的.cpp源代码文件中如下:

#include"..\lib.h"

#pragmacomment(lib,"..\\debug\\libTest.lib") 

//指定与静态库一起链接


第二,因为静态链接库是将全部指令都包含入调用程序生成的EXE文件中。因此如果用的是静态链接库,那么也就不存在“导出某个函数提供给用户使用”的情况,要想用就得全要!要不就都别要!:)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值