静态链接库lib和动态链接库dll区别
更新时间:2023-09-27 16:31:01 阅读量: 综合文库 文档下载
1.什么是静态连接库,什么是动态链接库
静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了。但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE 独立的 DLL 文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。
静态链接库与静态链接库调用规则总体比较 静态链接库(比较简单):
首先,静态链接库的使用需要库的开发者提供生成库的.h头文件和.lib文件。
生成库的.h头文件中的声明格式如下: extern \函数返回类型 函数名(参数表); 在调用程序的.cpp源代码文件中如下: #include \
#pragma comment(lib,\ //指定与静态库一起链接
第二,因为静态链接库是将全部指令都包含入调用程序生成的EXE文件中。因此如果用的是静态链接库,那么也就不存在“导出某个函数提供给用户使用”的情况,要想用就得全要!要不就都别要!:)
动态链接库:
动态链接库的使用,根据不同的调用方法,需要提供不同的资源:
1. 静态加载
程序静态编译的时候就静态导入dll,这样的话就需要提供给库使用者(C客户)如下文件:*.lib文件和.dll文件和*.h。其有2个坏处:
1 程序一开始运行就需要载入整个dll,无法载入程序就不能开始运行; 2 由于载入的是整个dll,需要耗费资源较多 其调用方法如下: #include \
#pragma comment(lib,\ 但是这种方式的话可以调用Class method.
2. 动态加载
只需要提供dll文件
因此调用程序若想调用DLL中的某个函数就要以某种形式或方式指明它到底想调用哪一个函数。但是无法调用Class method了。
如果要调用Dll中的function,需要经历3个步骤:
Handle h=LoadLibrary(dllName) --> GetProcAddress(h,functionName) 返回函数指针,通过函指针调用其function-->FreeLibrary(h)
例如:Another.dll有一个int Add(int x,int y)函数。则完整的调用过程如下: typedef int (* FunPtr)(int,int);//定义函数指针 FunPtr funPtr;
Handle h=LoadLibrary(\
funPtr=(FunPtr)GetProcAddress(h,\funPtr(2,3);//2+3; FreeLibrary(h);
示例
静态链接库的创建过程:
例如:我们创建一个自定义字符串的类CHironString,
只需要在IDE里面添加class即可,然后program相应函数体 代码如下所示: SDLL.h文件
------------------------------------------------------------------------ // HironString.h: interface for the CHironString class. //
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_HIRONSTRING_H__B23C5E5E_0E8B_4030_B057_34A40C934C59__INCLUDED_) #define AFX_HIRONSTRING_H__B23C5E5E_0E8B_4030_B057_34A40C934C59__INCLUDED_ #if _MSC_VER > 1000 #pragma once
#endif // _MSC_VER > 1000 class CHironString {
private:
char* m_data; public:
char * GetData();
CHironString(CHironString &other); int Length();
CHironString();
CHironString(char * str);
CHironString& operator=(CHironString &other); virtual ~CHironString(); }; #endif
// !defined(AFX_HIRONSTRING_H__B23C5E5E_0E8B_4030_B057_34A40C934C59__INCLUDED_) SDLL.CPP如下:
--------------------------------------------------------------
// HironString.cpp: implementation of the CHironString class. //
////////////////////////////////////////////////////////////////////// #include \
#include \
////////////////////////////////////////////////////////////////////// // Construction/Destruction
////////////////////////////////////////////////////////////////////// CHironString::CHironString() {
m_data=NULL; }
CHironString::CHironString(char * str) {
int len=strlen(str);
m_data=new char[len+1]; strcpy(m_data,str); }
CHironString::~CHironString() {
delete m_data; }
int CHironString::Length() {
return strlen(m_data); }
CHironString::CHironString(CHironString &other) {
int len=strlen(other.m_data)+1; m_data=new char[len];
strcpy(m_data,other.m_data); }
CHironString& CHironString::operator =(CHironString &other) {
if(this==&other) return *this; if(m_data!=NULL) delete[] m_data;
int len=strlen(other.m_data)+1; m_data=new char[len];
strcpy(m_data,other.m_data); return *this; }
char * CHironString::GetData() {
return m_data; }
然后,将程序编译后生成sdll.lib。 客户调用:将CHironString.h和SDLL.lib发布给client,那么客户端就可以调用我们编写的静态链接库了。
动态链接库的创建
首先我们必须先注意到DLL内的函数分为两种: (1)DLL 导出函数,可供应用程序调用;
(2)DLL 内部函数,只能在 DLL 程序使用,应用程序无法调用它们。
我们还是创建一个自定义的字符串处理类CHironString,不同之处其是一个动态链接库Dll。 动态链接库的export 需要在在相应的头文件中编写相应的MACRO
MyDll.h:自定义了一些类(函数)export 宏(该文件由IDE自动生成)如下 ------------------------------------------------------------------ #ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport) #else
#define MYDLL_API __declspec(dllimport) #endif
这是导出类的宏定义,将导出类必须加上该宏,才能被导出。
此处的MYDLL_EXPORTS会出现在 project-->settings-->C/C++页面上的 PreProcessor definition中,这个MACRO表明其要定义一个导出宏 CHironString.h 自定义类头文件
---------------------------------------------------------------- // HironString.h: interface for the CHironString class. //
//////////////////////////////////////////////////////////////////////
正在阅读:
静态链接库lib和动态链接库dll区别09-27
非法制造、出售非法制造的发票罪立案标准05-20
2018小升初数学思维训练专题十二06-23
3种取之有道的外链建设方法!04-10
十一3重庆市九龙坡区谢家湾小学课堂教学改革“六年影响一生”(名校课模讲座十一之3)11-02
低渗透含水气藏储层评价参数研究08-08
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 链接
- 静态
- 区别
- 动态
- lib
- dll
- 土木工程地质 - 图文
- 020-2008 SK-2T02碳酸盐岩分析仪操作规程 - 图文
- 《复变函数》试卷 - A及答案
- 数理统计A卷及答案
- UPS与发电机整体解决方案
- 论苏联在经互会中的得与失
- 江苏省泰兴市济川中学2017届九年级下学期第二次模拟考试历史试题(解析版)
- 大物作业纸12,13章
- 2018最新苏教版四年级语文上册《练习与测试》参考答案
- 湖北经济学院法商学院会计学B卷试卷
- 练习题1-6
- 杉木种植和技术
- 医学微生物学试题及答案
- 温度控制系统数学模型
- 传统文化与现代领导艺术 听课笔记
- 2.5亿粒年感冒清胶囊车间设计
- 这学期我选修了舞蹈鉴赏
- GT通讯协议 - v1.77KKS
- 教导主任在班主任工作会上的讲话
- 二级圆柱齿轮减速器的优化设计 - 最终版