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

静态链接库(Lib)与动态链接库(DLL)的区别

静态连接库就是把(lib)文件中用到的函数代码直接链接进目标程序,程序运行的时候不再需要其它的库文件;动态链接就是把调用的函数所在文件模块(DLL)和调用函数在文件中的位置等信息链接进目标程序,程序运行的时候再从DLL中寻找相应函数代码,因此需要相应DLL文件的支持。  

 

    静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了。但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE 独立的 DLL 文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。


   “每一个lib文件就是若干函数(假设只有函数)的定义”  
    lib库有两种,一种是包含了函数所在DLL文件和文件中函数位置的信息,称为导出库;一种是包含函数代码本身,一般现有的DLL,用的是前一种库;以前在DOS下的TC/BC等,是后一种库。包含函数原型声明的,是头文件(.h)。  
   
    “通过#include包含这些函数声明的头文件后,我们的应用程序就可以使用lib文件中的函数”  

     还要指定编译器链接相应的库文件。在IDE环境下,一般是一次指定所有用到的库文件,编译器自己寻找每个模块需要的库;在命令行编译环境下,需要指定每个模块调用的库。  
   
   “那他和直接给出那个函数定义的文件,比如.cpp文件,和头文件有什么区别,静态链接库有什么用”  
    cpp文件是源代码,库文件是编译后的二进制代码,比如你可以调用Windows的API,但是不能看到其源代码一样。  
   
   “还有不明白的是,静态链接库中的lib文件只要用到,则整个lib文件的内容都放进了exe文件中,那它是被编译进去还是链接的时候连接进去的呢?”   
    是在链接的时候将lib链接到目标代码中。

 

静态链接库(Lib)
在VC++6.0中new一个名称为libTest的static library工程,

并新建lib.h和lib.cpp两个文件,lib.h和lib.cpp的源代码如下:

//文件:lib.h
#ifndef LIB_H
#define LIB_H
extern "C" int add(int x,int y);   //声明为C编译、连接方式的外部函数
#endif

//文件:lib.cpp
#include "lib.h"
int add(int x,int y)
{
return x + y;
}


  编译这个工程就得到了一个.lib文件,这个文件就是一个函数库,它提供了add的功能。将头文件和.lib文件提交给用户后,用户就可以直接使用其中的add函数了。

  标准Turbo C2.0中的C库函数(我们用来的scanf、printf、memcpy、strcpy等)就来自这种静态库。

    下面来看看怎么使用这个库,在libTest工程所在的工作区内new一个libCall工程。libCall工程仅包含一个main.cpp文件,它演示了静态链接库的调用方法,其源代码如下:

 

 

#include <stdio.h>
#include "../lib.h"//不可丢失
#pragma comment( lib, "..//debug//libTest.lib" )  //指定与静态库一起连接
int main(int argc, char* argv[])
{
    printf( "2 + 3 = %d", add( 2, 3 ) );
}


  静态链接库的调用就是这么简单,或许我们每天都在用,可是我们没有明白这个概念。代码中#pragma comment( lib , "..//debug//libTest.lib" )的意思是指本文件生成的.obj文件应与libTest.lib一起连接。

相关文章:

  • 引用 引用 理解多线程
  • 诊断RAC数据库的启动
  • 异步备份和还原数据库:.NET发现之旅(六)
  • 【转载】一位大学老师写给即将毕业的大学生的100条忠告
  • GPON故障总结(四)
  • Css Hack
  • windows7下Windows Live Messenger 托盘问题
  • 图解Windows xp—FTP服务器配置
  • [经验总结] 关于单元测试
  • 我的OSPF学习笔记
  • 软件项目经理应有的能力和素质
  • 动态创建GridView的列(第二部分)
  • visual studio数据集dataset.xsd文件使用
  • java反射总结
  • 临 元 刘堪 《蔬林远山图》
  • 【comparator, comparable】小总结
  • Create React App 使用
  • Flannel解读
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • - 概述 - 《设计模式(极简c++版)》
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 开发基于以太坊智能合约的DApp
  • 聊聊redis的数据结构的应用
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 问题之ssh中Host key verification failed的解决
  • 正则表达式小结
  • C# - 为值类型重定义相等性
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • Semaphore
  • (1)STL算法之遍历容器
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (一)基于IDEA的JAVA基础12
  • (转)重识new
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .NET 反射 Reflect
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • .net程序集学习心得
  • /proc/stat文件详解(翻译)
  • @Autowired 与@Resource的区别
  • @private @protected @public
  • [error] 17755#0: *58522 readv() failed (104: Connection reset by peer) while reading upstream
  • [IE编程] 如何在IE8 下调试BHO控件/工具栏(调试Tab进程)