当前位置: 首页 > news >正文

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

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的基本代码(例如内存管理等Cruntime)是相同的。所以如果库比较小,还是使用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文件中。因此如果用的是静态链接库,那么也就不存在“导出某个函数提供给用户使用”的情况,要想用就得全要!要不就都别要!:)

相关文章:

  • centos 安装与操作
  • win7 防火墙开启ping
  • 人人网2014笔试算法题汇总
  • 暴风影音2014笔试算法题汇总
  • 华为2014笔试算法题汇总
  • 百度2014笔试算法题汇总
  • 美团网2014笔试算法题汇总
  • 2014百度校招笔试题
  • 从程序员到项目经理:认识项目经理
  • Struts2SpringHibernate整合示例,一个HelloWorld版的在线书店(项目源码+详尽注释+单元测试)...
  • 每天一道算法_2_求高精度幂
  • 【总结】android程序不显示图标,开机自动启动?我来告诉你
  • 完美洗牌算法学习
  • 关于完美洗牌算法中圈和圈起点的一个证明
  • 关于完美洗牌问题的若干思考
  • [ JavaScript ] 数据结构与算法 —— 链表
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • [deviceone开发]-do_Webview的基本示例
  • 【前端学习】-粗谈选择器
  • Druid 在有赞的实践
  • yii2权限控制rbac之rule详细讲解
  • 构建工具 - 收藏集 - 掘金
  • 简析gRPC client 连接管理
  • 排序算法之--选择排序
  • 山寨一个 Promise
  • 一些css基础学习笔记
  • 追踪解析 FutureTask 源码
  • 阿里云ACE认证学习知识点梳理
  • # 透过事物看本质的能力怎么培养?
  • (20050108)又读《平凡的世界》
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (备忘)Java Map 遍历
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (译)2019年前端性能优化清单 — 下篇
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转)scrum常见工具列表
  • (转)shell中括号的特殊用法 linux if多条件判断
  • (转)Sql Server 保留几位小数的两种做法
  • .NET : 在VS2008中计算代码度量值
  • .NET 8.0 发布到 IIS
  • .net CHARTING图表控件下载地址
  • .NET CORE Aws S3 使用
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .Net 代码性能 - (1)
  • .NET 设计模式—简单工厂(Simple Factory Pattern)
  • .net 设置默认首页
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(朱雀组)
  • [ vulhub漏洞复现篇 ] JBOSS AS 5.x/6.x反序列化远程代码执行漏洞CVE-2017-12149
  • [383] 赎金信 js
  • [ACM] hdu 1201 18岁生日
  • [Android View] 可绘制形状 (Shape Xml)
  • [C语言]——内存函数
  • [Excel] vlookup函数