C# - *.dll vs *.lib (动态链接库 vs 静态链接库)
静态库
库(Library)就是一段编译好的二进制代码,加上头文件就可以使用。
静态链接库(Windows 下的*.lib, Linux & Mac 下的 .a)。之所以叫做静态,是因为静态库在编译的时候会被直接拷贝一份,复制到目标程序里,这段代码在目标程序里就不会再改变了。
优点:
1、编译完成之后,库文件实际上就没有作用了。目标程序没有外部依赖,直接就可以运行。
2、代码装载速度快,执行速度略比动态链接库快。缺点:
1、会使用目标程序的体积增大。
2、包含相同的公共代码,造成浪费,扩展性较差。
动态库
动态链接库(Windows 下的*.dll, Linux & Mac 下的 .dylib)。与静态库相反,动态库在编译时并不会被拷贝到目标程序中,目标程序中只会存储指向动态库的引用。等到程序运行时,动态库才会被真正加载进来。
优点:
1、不需要拷贝到目标程序中,不会影响目标程序的体积,而且同一份库可以被多个程序使用(因为这个原因,动态库也被称作共享库)。同时,编译时才载入的特性,也可以让我们随时对库进行替换,而不需要重新编译代码。
2、更加节省内存并减少页面交换。
3、可维护性和可扩展性高。
4、适用于大规模的软件开发,使开发过程独立、耦合度小,便于不同开发者和开发组织之间进行开发和测试。缺点:
1、动态载入会带来一部分性能损失,使用动态库也会使得程序依赖于外部环境。
2、如果环境缺少动态库或者库的版本不正确,就会导致程序无法运行(Linux 下喜闻乐见的 lib not found 错误)。
三种DLL(Win32DLL,MFC常规DLL和MFC拓展DLL)
学习了三种动态链接库的基本知识,分别是Win32DLL,MFC常规DLL和MFC拓展DLL。
Win32DLL使用的是Win32的API实现的,只能导出函数,能被各种应用程序调用,适用范围最广。
MFC常规DLL是适用MFC创建的,就像MFC程序跟Win32程序的关系一样,MFC常规DLL和Win32DLL的关系也是如此。它使用MFC的机制,只能导出标准C函数。如此,它便可以被大部分Win32程序调用。
MFC拓展DLL也也使用的是MFC机制创建的,相比于MFC常规DLL,拓展DLL可以导出C++类和MFC派生类,如此扩大了DLL的接口范围。此长彼消,MFC拓展DLL的适用范围较小,只能被MFC程序调用。因为它导出的不只是函数,还有C++类和MFC派生类。
另外,所有的动态链接库都有两种链接方式:隐式调用和显示调用。隐式链接使用起来比较方便,不过不够灵活;显示链接可以在真正要用DLL的时候才装入,并在适当的时候释放,操作相对复杂一些。
版权声明
1.
版权声明:本文为CSDN博主「wche1990」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wche1990/article/details/6944647
2.
作者:乂滥好人
链接:https://www.jianshu.com/p/58f29bb5df45
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
C# - *.dll vs *.lib (动态链接库 vs 静态链接库)的更多相关文章
- Qt 共享库(动态链接库)和静态链接库的创建及调用
前言: 编译器 Qt Creator, 系统环境 win7 64 位 1.创建共享库: 新建文件或项目->选择 Library 和 c++ 库->选择共享库->下一步(工程名为 sh ...
- Linux下动态链接库和静态链接库
第一部分:编译过程 先了解一下linux下C代码的编译过程,C代码的编译,一般分成四个阶段,包括:预编译,编译,汇编和链接,这四个阶段的分工是 预处理过程,负责头文件展开,宏替换,条件编译的选择,删除 ...
- [转载]GCC 编译使用动态链接库和静态链接库--及先后顺序----及环境变量设置总结
来自http://blog.csdn.net/benpaobagzb/article/details/51364005 GCC 编译使用动态链接库和静态链接库 1 库的分类 根据链接时期的不同,库又有 ...
- Windows 下动态链接库和静态链接库
1.静态链接库:就是在编译的时候把库中代码复制进工程中,导致工程变大,但是速度快. 缺点在于一套代码可能在内存中有多份拷贝,占用内存. 2.动态链接库:库由windos api加载库代码,内存中只有一 ...
- GCC编译过程与动态链接库和静态链接库
1. 库的介绍 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 本质上来说库是一种可执行代码的二进制形式,可 ...
- c++动态链接库及静态链接库的生成与使用
1,新建控制台工程xdltest,改属性-配置属性-常规-配置类型为 动态库.dll或静态库.lib2,打开工程后添加 dltest.h, dltest.cpp,其中.h与.cpp名字没必要一样3,编 ...
- GCC 编译使用动态链接库和静态链接库
1 库的分类 根据链接时期的不同,库又有静态库和动态库之分. 静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行. 有 ...
- GCC 编译使用动态链接库和静态链接库的方法
1 库的分类 依据链接时期的不同,库又有静态库和动态库之分. 静态库是在链接阶段被链接的.所以生成的可执行文件就不受库的影响了.即使库被删除了,程序依旧能够成功执行. 有别于静态库,动态库的链接是在程 ...
- 【转】gcc 编译使用动态链接库和静态链接库
1 库的分类 根据链接时期的不同,库又有静态库和动态库之分. 静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行. 有 ...
随机推荐
- C3P0连接池属性配置注释
属性 解释 acquireIncrement 当连接池中的连接耗尽的时候c3p0一次同时获取的连接数 默认为:3 acquireRetryAttempts 定义在从数据库获取新连接失败后重复尝试的次数 ...
- 笔记60 Spring+Mybatis整合
整合思路:将SessionFactory交给Spring管理,并且把Mapper和XML结合起来使用. 一.目录结构 二.基本的pojo Category.java package com.pojo; ...
- jQuery随机抽取数字号代码
html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta ...
- 让微信小程序每次请求的时候不改变session_id的方法
让微信小程序每次请求的时候不改变session_id的方法 每次微信小程序请求的时候都会改变session id, 还好他的请求方法内可以设置header头 所以只需要在启动程序后第一次请求服务器获得 ...
- Hive SQL之分区表与分桶表
Hive sql是Hive 用户使用Hive的主要工具.Hive SQL是类似于ANSI SQL标准的SQL语言,但是两者有不完全相同.Hive SQL和Mysql的SQL方言最为接近,但是两者之间也 ...
- 后端异步接口url
/wp-common/products.php?term_id=4&page=1 var currentAjax; var total = 0; function getAjaxData(te ...
- delphi TTcpClient TTcpServer分析(转)
delphi TTcpClient TTcpServer分析(转) 只描述windows socket部分. sockets.pas中各个类得继承关系: TBaseSocket | --------- ...
- (转)OpenFire源码学习之十四:插件管理
转:http://blog.csdn.net/huwenfeng_2011/article/details/43418433 Plugin管理 Openfire把插件模块加入到容器分为以下步骤: l ...
- 使用FTPClient实现文件上传服务器
import ch.qos.logback.classic.Logger; import org.apache.commons.net.ftp.*; import org.slf4j.LoggerFa ...
- Redis启动Sentinel出现警告的解决
Redis 3.0.7版本启动时出现警告的解决办法 7283:M 12 Mar 12:13:33.749 # WARNING: The TCP backlog setting of 511 canno ...