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

.h头文件 .lib动态链接库文件 .dll 动态链接库

为什么80%的码农都做不了架构师?>>>   hot3.png

(1).h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的。

附加依赖项的是.lib 不是.dll 

若生成了DLL ,则肯定也生成 LIB文件

如果要完成源代码的编译和链接,有头文件和lib就够了。
如果也使动态连接的程序运行起来,有dll就够了。
在开发和调试阶段,当然最好都有。

.h .lib .dll三者的关系是:

H文件 作用是:声明函数接口 

DLL文件 作用是: 函数可执行代码 

当我们在自己的程序中引用了一个H文件里的函数,编链器怎么知道该调用哪个DLL文件呢? 

这就是LIB 文件的作用: 告诉链接器 调用的函数在哪个DLL中,函数执行代码在DLL中的什么位置 

这也就是为什么需要 附加依赖项 .LIB文件 ,它起到桥梁的作用。

如果生成静态库文件,则没有DLL ,只有lib,这时函数可执行代码部分也在lib文件中

目前以lib后缀的库有两种,一种为静态链接库


(Static  Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库


(Import  Libary,以下简称“导入库”)。 

静态库是一个或者多个obj文件的打包,所以有人干脆把从obj文件生成lib的过程称为Archive,即合并到一起。比如你链接一个静态库,如果其中有错,它会准确的找到是哪个obj有错,即静态lib只是壳子。   
动态库一般会有对应的导入库,方便程序静态载入动态链接库,否则你可能就需要自己LoadLibary调入DLL文件,然后再手工GetProcAddress获得对应函数了。有了导入库,你只需要链接导入库后按照头文件函数接口的声明调用函数就可以了。

导入库和静态库的区别很大,他们实质是不一样的东西。静态库本身就包含了实际执行代码、符号表等等,而对于导入库而言,其实际的执行代码位于动态库中,导入库只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息。 

(2)一般的动态库程序有lib文件和dll文件。lib文件是必须在编译期就连接到应用程序中的,而dll文件是运行期才会被调用的。如果有dll文件,那么对应的lib文件一般是一些索引信息,具体的实现在dll文件中。如果只有lib文件,那么这个lib文件是静态编译出来的,索引和实现都在其中。静态编译的lib文件有好处:给用户安装时就不需要再挂动态库了。但也有缺点,就是导致应用程序比较大,而且失去了动态库的灵活性,在版本升级时,同时要发布新的应用程序才行。
(3)在动态库的情况下,有两个文件,而一个是引入库(.LIB)文件,一个是DLL文件,引入库文件包含被DLL导出的函数的名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到所需要使用的DLL文件,库中的函数和数据并不复制到可执行文件中,因此在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中所要调用的函数的内存地址,这样当一个或多个应用程序运行是再把程序代码和被调用的函数代码链接起来,从而节省了内存资源。从上面的说明可以看出,DLL和.LIB文件必须随应用程序一起发行,否则应用程序将会产生错误。


在VS2008中添加.LIB文件

法一:在project属性->链接器->输入->附加依赖项

在以上路径加入即可,多个lib名用空格隔开

 

法二:直接在代码中表现:

#pragma comment(lib,"winmm.lib")   // 加入winmm.lib库

转载于:https://my.oschina.net/dake/blog/196650

相关文章:

  • Magento 模块开发之DispatchEvent(转)
  • autohotkey在运维中的应用
  • nodeJS+express+Jade写一个局域网聊天应用(node基础)
  • ASP.NET C#.NET 通用权限管理系统组件2011年01月BUG修改情况列表清单
  • Ocelot(七)- 入门
  • flask中的session
  • mk-parallel-dump 实验
  • 配置Windows环境的DNS轮询(简单的负载均衡)
  • Out of memory (Needed 16777224 bytes)的错误解决
  • Servlet、Filter、Listener总结
  • 《The One!团队》第八次作业:ALPHA冲刺(二)
  • HttpClient 4.3.3 cookie rejected的解决办法
  • 大象也能起舞,Citrix X1计划让你对笔记本电脑say good bye
  • VOA 2009/11/02 DEVELOPMENT REPORT - In Kenya, a Better Life Through Mobile Money
  • 安装 chkrootkit报错:/usr/bin/ld: cannot find -lc
  • Apache Spark Streaming 使用实例
  • gcc介绍及安装
  • JavaScript新鲜事·第5期
  • Python学习之路13-记分
  • React+TypeScript入门
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • Spring Cloud Feign的两种使用姿势
  • Spring声明式事务管理之一:五大属性分析
  • 编写高质量JavaScript代码之并发
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 三分钟教你同步 Visual Studio Code 设置
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 思维导图—你不知道的JavaScript中卷
  • 一天一个设计模式之JS实现——适配器模式
  • 译米田引理
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • (九十四)函数和二维数组
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (算法二)滑动窗口
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • . NET自动找可写目录
  • .“空心村”成因分析及解决对策122344
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .Net IE10 _doPostBack 未定义
  • .net MySql
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .NET 命令行参数包含应用程序路径吗?
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .secret勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复
  • []C/C++读取串口接收到的数据程序
  • [20140403]查询是否产生日志
  • [20181219]script使用小技巧.txt
  • [23] 4K4D: Real-Time 4D View Synthesis at 4K Resolution
  • [Arduino学习] ESP8266读取DHT11数字温湿度传感器数据