c语言库文件是dll还是lib,C语言之静态链接库与动态链接库(2)

我们发现,无论是静态链接库还是动态链接库,最后都有lib文件,那么两者区别是什么呢?

其实,两个是完全不一样的东西。静态库对应的lib文件叫静态库,动态库对应的lib文件叫导入库。实际上静态库本身就包含了实际执行代码、符号表等等,而对于导入库而言,其实际的执行代码位于动态库中,导入库只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息。

2. 对于静态链接库,我们在编译和链接的时候已经将所有的代码都导入进来,因此,当生成可执行文件以后,可执行文件包含所有的代码。因此,在可执行文件运行时就不再需要静态库了,而对于动态链接库,实际上,可执行文件不包含DLL中的内容,只是通过导入库(.lib)知道了相应的地址信息,因此,可执行文件在运行时动态得去加载DLL.

五、小结

1. 静态库

* 静态库是把程序运行时需要使用的函数编译在一个二进制文件中,扩展名为.lib。当程序link时把静态库中的二进制数据和程序其它数据放到一起。程序运行时不在需要lib和dll文件的支持。这样做的坏处是开发出来的程序占用磁盘空间较大。特别是windows系统中本来就有或很多程序运行都需要的函数完全没有必要每次开发程序时都要使用各自的静态库。

* 静态库为.lib文件形式存在

* 链接后产生的可执行文件包含了所有需要调用的函数的代码,因此占用磁盘空间较大

* 如果有多个(调用相同库函数的)进程在内存中间时运行,内存中就存有多份相同的库函数代码,因此占用内存空间较多。

2. 动态库

* 动态库在开发时仅是把dll中的函数名和参数放到应用程序中,应用程序运行时根据函数名和参数调用dll中的函数来运行,这样操作系统中的应用程序可以同时使用同一个dll。可以有效地节省硬盘空间,当然这样做使得程序设计更有层次。也有利于软件工程师的分工和信息安全

* 动态库以.dl文件形式存在,且一般都有一个对应的引入库以.lib文件形式存在。纯资源dll不生成.lib引入库。

>引入库和静态库的扩展名均为*.lib,但是引入库仅包含一些函数名和参数信息,没有函数体,是为调用动态库服务的,它和动态库的关系相当于.h文件和.cpp文件之间的关系;

* 动态库两种绑定方式

>静态绑定(static blnding) 使用静态绑定的程序在一开始载入内存的时候,载入程序就会把程序所有调用到的动态代码的地址算出、确定下来。这种方式使程序刚运行时的初始化时间较长,不过一但完成动态装载,程序的运行速度就很快。

>动态绑定(dynamic binding)   使用这种方式的程序并不在一开始就完成动态链接,而是直到真正调用动态库代码时,载入程序才计算(被调用的那部分)动态代码的逻辑地址,然后等到某个时候,程序又需要调用另外某块动态代码时,载入程序才又去计算这部分代码的逻辑地址。所以,这种方式侄程序初始化时间较短,但运行期间的性能比不上静态绑定的程序。

* 使用动态库的两种方法(windows)

>方法一: load-time dynamic linking

在要调用dll的应用程序链接时,将dll的输入库文件(import library,.lib文件)包含进去。具体的做 法是在源文件开头加一句#include ,然后就可以在源文件中调用dlldemo.dll中的输出文件了。

>方法二: run-time dynamic linking  不必在链接时包含输入库文件,而是在源程序中使用LoadLibrary或LoadLibraryEx动态的载入dll。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/364478.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NTC3950-10K温度传感器

一、计算公式 补充: B3950 R10K T225度 查RT表,25度对应的是10K 电路:   热敏电阻与上拉电阻R813分压,获取温度与Vo电压的关系,在根据Vo折算出与MCU ADC的数值。 再将ADC代出Rt,即得到ADC与T的关系公式。…

使不安全变得更加安全

总览 如果直接使用Unsafe,则可能会导致JVM崩溃。 当您访问尚未映射的内存页面并且在Unix上的结果是SIGSEG(如果您访问页面0)或SIGBUS(如果您访问另一个未映射的页面)时,就会发生这种情况。 使用MethodHand…

二分搜索树的基本实现

基本操作的动画演示 插入(略) 搜索(略) 删除节点 代码 package com.yunche.datastructure;import java.util.LinkedList; import java.util.Queue;/*** ClassName: BST* Description: 二叉搜索树:每个节点的左子树的值…

js ||

||或位符号 a || b 1.当a ,b 均为true时,return a 2.当 a,b均为false时,return b 3.当a,b为一false一true,return true的那个值 && 与位符号 a&&b 1.当a,b均为true时,return b 2.当,b均为false时&#xff…

计算机c语言二级题型,计算机二级C语言题型和评分标准

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼全国计算机二级考试大题把题目给定程序删除了,正确运行,这样会不会给分?50、请编写函数fun, 函数的功能是: 将M行N列的二维数组中的数据, 按列的顺序依次放到一维数组中。函数fun中给出的语句仅供…

什么是Mockito Extra接口?

如果要编写轻量级的JUnit测试, Mockito是我最喜欢的小帮手。 如有必要,可以通过模拟轻松地替换被测单元的“实际”依赖关系,这非常有用。 尤其是在处理框架API的边界线时,此类依赖项的设置否则可能非常昂贵。 但是有时候情况要复…

d9900 修改ip 思科dcm_思科设备SSH登陆详细配置过程

思科设备SSH登陆详细配置过程我们用GNS3进行拓扑搭建。实验拓扑图如下:进行完基本配置之后开始配置SSH服务器(R2)1.首先验证设备是否支持SSHR2#show ip ssh能够识别这条命令就说明支持。2.配置IP域名。使用config# ip domain-name domain-name全局配置模式命令配置网…

scrapy框架使用splash渲染引擎爬取动态页面

1.启动docker,在命令行里输入 docker run -p 8050:8050 scrapinghub/splash在docker上运行splash引擎 2.接下来就可以来写爬虫文件了 首先在setting里配置 splash_urlhttp://loaclhost:8050 DUPEFLITERscrapy_splash.SplashAwareDupeFilterDOWNLOADER_MIDDLEWARES …

Testing BlogJet

I have installed an interesting application - BlogJet. Its a cool Windows client for my blog tool (as well as for other tools). Get your copy here: http://blogjet.com"Computers are useless. They can only give you answers." -- Pablo Picasso转载于:…

async,await

function timeout(ms){return new Promise(function(resolve){setTimeout(resolve,ms)}) }async function asyncPrint(value,ms){await timeout(ms);console.log(value) } asyncPrint(hello world,5000) 这段代码是过了5秒再显示hello world await是要等待这句代码执行完&…

Homebrew是什么?怎么关闭自动更新?

Homebrew是MacOS 的软件包管理器。 通过它可以安装、卸载、更新、查看、搜索任何想要安装的软件。如:git, node等。 安装Homebrew /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 查看Homebrew br…

C语言中case后面有空格吗,C语言中switch case语句可变参实现方法(case 参数 空格...空格 参数 :)...

正常情况下,switch case语句是这么写的:switch(参数){case1:...;break;case2:...;break;default:...break;}这种是我们最常见的写法,当然也可以这么写:switch(参数){case1:case2:case3:case4:...;break;default:...;break;}接下来…

java 把string转为keyevent_盘点现在Java强大第三方库(字符串操作),程序员都该知道!...

1.字符串与集合间的转化引用第三方库 Apache Commons Lang jre连接值得一提的自JDK1.8以后字符串集合转为字符串可以使用String类下的join()方法,但别的数据类型还是要依靠第三方库--对比JDK和第三库代码如下我自己是一名从事了多年开发的java老程序员,这段时间整理…

Redis安装文档

1.前置条件 前置条件:linux已经可以上网,参考:https://www.cnblogs.com/ZenoLiang/p/10201875.html 2.安装redis 2.1依赖包检查 1. yum install cpp -y 2. yum install binutils -y 3. yum install glibc-kernheaders -y 4. yum install…

JDK 8的启发性Javadoc

标准JDK 8 API文档的一个不错的功能之一就是能够查看所有或不同类别的方法,正如我在博客文章JDK 8 Javadoc Tweaked For Methods Listings中所讨论的那样。 尽管这种分类既方便又有用,但是与JDK 8中许多新类和程序包相关联的文本注释无疑更有用&#xff…

我用Mono(1)

我在Mono 0.1就开始关注和试用Mono了。我印象最深的一次是,我在FreeBSD里编译好了Mono(FreeBSD装在VPC里)。我用了同样的算法写了一个CS文件和JAVA文件。然后在虚拟机的FreeBSD的Mono下编译运行,把Java文件在真实机器的Windows XP…

setTimeout(fn,0)

我们都知道setTimeout是一个延迟执行的函数 console.log(1); setTimeout(function(){console.log(2);},1000); console.log(3); 会得到1,3,2 但是 setTimeout(function(){console.log(1);}, 0); console.log(2); 你知道这段代码会执行什么样的效果吗 正…

Java基本数据类型的传值

传递值: 说明:标题其实说法是错误的。Java中只有值传递,没有引用传递。 ... ... //定义了一个改变参数值的函数 public static void changeValue(int x) { x x *2; } ... ... //调用该函数 int num 5; System.out.println(num); change…

红楼梦人物分析系统c语言,Gephi分析红楼梦

前言上一周赶了好久的社会网络计算,貌似是第四周还是第五周的时候,那时候我们就把题目定下来了吧,然后一直拖着没有做。其中的原因多种多样 ,其实也可以说没有什么原因,就是不想做而已,然后就假装忘记23333…

二、MyBatis-HelloWorld

环境准备 1.创建数据库表 create table tbl_employee (id int(11) primary key AUTO_INCREMENT comment "ID",last_name varchar(20) default null comment "姓名",email varchar(20) default null comment "邮件",gender varchar(1) default nu…