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

2023-05-16

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文件中。因此如果用的是静态链接库,那么也就不存在“导出某个函数提供给用户使用”的情况,要想用就得全要!要不就都别要!:)

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2014百度校招笔试题之动态链接库&静态链接库详解 的相关文章

随机推荐

  • ubuntu18.04安装google浏览器

    sudo wget http www linuxidc com files repo google chrome list P etc apt sources list d wget q O https dl google com linu
  • ubuntu18.04安装opencv3.2.0

    1 下载所需安装包 opencv 3 2 0下载地址 xff1a opencv 3 2 0 opencv contrib 3 2 0下载地址 xff1a opencv contrib 3 2 0 2 安装所需依赖 sudo apt get
  • vscode调试orbslam2配置过程

    1 c cpp properties json 34 configurations 34 34 name 34 34 Linux 34 34 includePath 34 34 workspaceFolder 34 34 usr inclu
  • 喜茶皇茶茶叶带您走上致富之路

    我国是茶文化的发源地 xff0c 尤其是南方各类品种的茶层出不穷 xff0c 茶韵茶香引人入胜 消费者生活水平大幅提高 xff0c 饮茶几乎已经成为一种时尚 xff0c 皇茶 在市场上受到大家的认可与喜爱 xff0c 短短时间内迅速发展壮大
  • UCOSII pdf 电子书籍

    https pan baidu com share init surl 61 RrZKnhvCuC 3qCOT0bi1Gg 提取码 xff1a 4a0f
  • 变频器的逆变、变频原理

    变频器的逆变 变频原理 YJZhang 从事制造业质量管理 xff0c 做过PCBA 线束 电话机 变频器行业 90 人赞同了该文章 变频器将直流电转变为交流电的这个过程叫 逆变 xff08 inverting 先讲逆变过程 xff0c 分
  • 8086中断系统——《x86汇编语言:从实模式到保护模式》读书笔记04

    80X86中断系统 能够处理256个中断 用中断向量号0 xff5e 255区别 可屏蔽中断还需要借助专用中断控制器Intel 8259A实现优先权管理 1 中断的分类 中断可以分为内部中断和外部中断 xff08 1 xff09 内部中断
  • 任务切换的方法——《x86汇编语言:从实模式到保护模式》读书笔记37

    任务切换的方法 x86汇编语言 xff1a 从实模式到保护模式 读书笔记37 1 中断门和陷阱门 在实模式下 xff0c 内存最低端的1M是中断向量表 xff0c 保存着256个中断处理过程的段地址和偏移 当中断发生时 xff0c 处理器把
  • 不用 H5,闲鱼 Flutter 如何玩转小游戏?

    阿里妹导读 xff1a 最近APP游戏化成为了一个新的风口 xff0c 把在游戏中一些好玩的 能吸引用户的娱乐方式或场景应用在应用当中 xff0c 以达到增加用户粘性 xff0c 提升DAU的效果 xff0c 成本较低 同时在一些需要对用户
  • 【Invalid bound statement (not found)的解决方法】

    前言 xff1a 先说下我自己 xff0c 最开始我是可以的 xff0c 结果我去改了下mapper接口里方法的参数类型 xff0c 突然就报Invalid bound statement not found 这个错误 xff0c 我在网上
  • FreeRTOS学习(四) 列表的插入和删除

    声明及感谢 跟随正点原子资料学习 在此作为学习的记录和总结 环境 keil stm32f103 首先定义列表 xff0c 以及列表项 List t TestList 列表 ListItem t ListItem1 列表项1 ListItem
  • FreeRTOS学习(六) 时间片调度

    声明及感谢 跟随正点原子资料学习 在此作为学习的记录和总结 环境 keil stm32f103 对于FreeRTOS 允许同等任务优先级存在 那么对于多个同等优先级的任务运行 情况的是如何 FreeRTOS 的机制就是对于同等优先级任务来说
  • FreeRTOS学习(十) 信号量

    声明及感谢 跟随正点原子资料学习 在此作为学习的记录和总结 环境 keil stm32f103 二值信号量 二值信号量 通常用于互斥访问 或同步 大多数用于同步 任务与任务 或 任务 与中断的同步 和队列一样 信号量API函数允许设置一个阻
  • Arduino 操控 12v 电压控制电磁铁 (线性振动马达?

    在此记录一下制作过程 xff0c 以作日后参考 效果 xff1a 线性震动马达 xff1f 大概思路 xff1a 通过L298N xff0c 用外接12v电源给电磁铁进行12v供电 xff0c 给arduino进行5v供电 一个电磁铁的供电
  • Dijkstra算法详解

    1 dijkstra算法简介 Dijkstra算法是由E W Dijkstra于1959年提出 xff0c 又叫迪杰斯特拉算法 xff0c 它应用了贪心算法模式 xff0c 是目前公认的最好的求解最短路径的方法 算法解决的是有向图中单个源点
  • C++建立动态二维数组

    C 43 43 建立动态二维数组主要有两种方法 xff1a 1 使用数组指针 xff0c 分配一个指针数组 xff0c 将其首地址保存在b中 xff0c 然后再为指针数组的每个元素分配一个数组 int b 61 new int row 分配
  • 理解负载均衡

    什么是平均负载 xff1f 单位时间内 xff0c 系统处于可运行状态和不可中断状态的平均进程数 xff0c 也就是平均活跃进程数 xff0c 它和CPU使用率并没有直接关系 所谓可运行状态的进程 xff0c 是指正在使用CPU或者等待CP
  • 理解CPU使用率和CPU上下文切换

    1 CPU使用率 1 1 CPU使用率查看 当发现服务或机器卡的时候 xff0c 我们都是先通过top命令查看服务器CPU使用率 默认每3秒刷新一次 top top 18 10 58 up 1216 days 7 38 4 users lo
  • 自动驾驶概述

    1 自动化能力定义 对自动驾驶能力有多个定义标准 xff0c 比较常用的是SAE International关于自动化层级的定义 具体是 L0 驾驶员完全掌控车辆 L1 自动系统有时能够辅助驾驶员完成某些驾驶任务 L2 自动系统能够完成某些
  • 2014百度校招笔试题之动态链接库&静态链接库详解

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