VC中静态链接库、动态链接库 编程深入浅出 详解
C语言程序静态库和动态库的创建及其应用
C语言程序静态库和动态库的创建及其应用在用c写程序时,很多时候需要存储一些简单的数据,如果为此而用mysql数据库就有些大才小用了,可以把这些数据以结构的形写入文件,然后再需要时读取文件,取出数据。
如下是定义函数的源文件和头文件:源文件struct.c:#include "struct.h"//第一个参数是要写入的文件名,第二个参数是缓冲区,第三个参数是缓冲区大小,第四个参数是打开文件流的形态,返回TRUE表示写入成功,返回FALSE表示写入失败int writeStruct(const char *fileName,char *buffer,int bufferLen,char *mode){ int ret;FILE *fileID = NULL;fileID = fopen(fileName,mode);if (fileID == NULL){perror("fopen");goto writeEnd;}rewind(fileID);ret = fwrite(buffer,bufferLen,1,fileID);if (ret <= 0){perror("fwrite");goto writeEnd;}if (fileID != NULL){fclose(fileID);fileID = NULL;}return TRUE;writeEnd:if (fileID != NULL){fclose(fileID);fileID = NULL;}return FALSE;}//第一个参数是要读取的文件名,第二个参数是缓冲区,第三个参数是缓冲区大小,第四个参数是打开文件流的形态,返回TRUE表示读取成功,返回FALSE表示读取失败int readStruct(const char *fileName,char *buffer,int bufferLen,char *mode){ int ret;FILE *fileID = NULL;fileID = fopen(fileName,mode);if (fileID == NULL){perror("fopen");goto readEnd;}rewind(fileID);memset(buffer,0,sizeof(buffer));ret = fread(buffer,bufferLen,1,fileID);if (ret >= 0){strcat(buffer,"\0");}else{perror("fread") ;goto readEnd;}if (fileID != NULL){fclose(fileID);fileID = NULL;}return TRUE;readEnd:if (fileID != NULL){fclose(fileID);fileID = NULL;}return FALSE;}头文件struct.h:#ifndef OWNSTRUCT_H_#define OWNSTRUCT_H_#include#include#include#define FALSE 0#define TRUE 1//第一个参数是要写入的文件名,第二个参数是缓冲区,第三个参数是缓冲区大小,第四个参数是打开文件流的形态,返回TRUE表示写入成功,返回FALSE表示写入失败int writeStruct(const char *fileName,char *buffer,int bufferLen,char *mode);//第一个参数是要读取的文件名,第二个参数是缓冲区,第三个参数是缓冲区大小,第四个参数是打开文件流的形态,返回TRUE表示读取成功,返回FALSE表示读取失败int readStruct(const char *fileName,char *buffer,int bufferLen,char *mode);#endif为了使用方便,可以把这两个函数接口定义为动态链接库或静态链接库。
C语言编写静态链接库及其使用
C语⾔编写静态链接库及其使⽤本篇讲述使⽤C语⾔编写静态链接库,⽽且使⽤C和C++的⽅式来调⽤等.⼀、静态库程序:执⾏时不独⽴存在,链接到可执⾏⽂件或者动态库中,⽬标程序的归档。
1、⽤C编写静态库步骤a.建⽴项⽬(Win32 Static Library)b.加⼊库程序,源⽂件使⽤C⽂件(Win32 Static Library)clib.c库源⽂件<pre name="code" class="cpp">int CLib_add(int add1,int add2){return add1+add2;}int CLib_sub(int add1,int add2){return add1-add2;}编译,链接后产⽣clib.lib,后⾯使⽤这个⽂件2、静态库的使⽤a.建⽴⼀个C⽂件,能够在⽂件⾥直接使⽤C库函数,不须要头⽂件,C编译器仅仅是依据库函数名称,在库中找到相应的函数代码,进⾏链接。
b.库的路径设置。
项⽬的“Setting”中设置库路径,也能够使⽤#pragmakeyword设置 #pragma comment(lib,"..\\clib\\clib.lib")3、C的⽅式调⽤C语⾔编写的静态库C Type//C编译器什么头⽂件及函数声明都不要.....#pragma comment(lib,"..\\clib\\clib.lib") //通知链接器。
到那找源码.int main(void){int num1 = 100;int num2 = 1000;int nSum = CLib_add(num1,num2);int nSub = CLib_sub(num1,num2);printf("nSum = %d,nSub = %d\r\n",nSum,nSub);return 0;}</pre><pre name="code" class="cpp">4、<strong>C++的⽅式调⽤C语⾔编写的静态库</strong>在CPP环境使⽤C静态库。
C++静态库与动态库深入研究——动态库篇!
C++静态库与动态库深⼊研究——动态库篇!⼀、动态库通过之前静态库那篇⽂章的介绍。
发现静态库更容易使⽤和理解,也达到了代码复⽤的⽬的,那为什么还需要动态库呢?1、为什么还需要动态库?为什么需要动态库,其实也是静态库的特点导致。
▶空间浪费是静态库的⼀个问题。
▶另⼀个问题是静态库对程序的更新、部署和发布页会带来⿇烦。
如果静态库liba.lib更新了,所以使⽤它的应⽤程序都需要重新编译、发布给⽤户(对于玩家来说,可能是⼀个很⼩的改动,却导致整个程序重新下载,全量更新)。
动态库在程序编译时并不会被连接到⽬标代码中,⽽是在程序运⾏是才被载⼊。
不同的应⽤程序如果调⽤相同的库,那么在内存⾥只需要有⼀份该共享库的实例,规避了空间浪费问题。
动态库在程序运⾏是才被载⼊,也解决了静态库对程序的更新、部署和发布页会带来⿇烦。
⽤户只需要更新动态库即可,增量更新。
动态库特点总结:✪动态库把对⼀些库函数的链接载⼊推迟到程序运⾏的时期。
✪可以实现进程之间的资源共享。
(因此动态库也称为共享库)✪将⼀些程序升级变得简单。
✪甚⾄可以真正做到链接载⼊完全由程序员在程序代码中控制(显⽰调⽤)。
Window与Linux执⾏⽂件格式不同,在创建动态库的时候有⼀些差异。
✪在Windows系统下的执⾏⽂件格式是PE格式,动态库需要⼀个DllMain函数做出初始化的⼊⼝,通常在导出函数的声明时需要有_declspec(dllexport)关键字。
✪ Linux下gcc编译的执⾏⽂件默认是ELF格式,不需要初始化⼊⼝,亦不需要函数做特别的声明,编写⽐较⽅便。
与创建静态库不同的是,不需要打包⼯具(ar、lib.exe),直接使⽤编译器即可创建动态库。
2、Linux下创建与使⽤动态库linux动态库的命名规则为:动态链接库的名字形式为 libxxx.so,前缀是lib,后缀名为“.so”。
✪针对于实际库⽂件,每个共享库都有个特殊的名字“soname”。
动态链接库编程
VC++动态链接库(DLL)编程――理解库作者:宋宝华e-mail:21cnbao@1.概论先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL 看成一种仓库,它提供给你一些可以直接拿来用的变量、函数或类。
在仓库的发展史上经历了“无库-静态链接库-动态链接库”的时代。
静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了。
但是若使用DLL,该DLL不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE 独立的DLL文件。
静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。
对动态链接库,我们还需建立如下概念:(1)DLL的编制与具体的编程语言及编译器无关只要遵循约定的DLL接口规范和调用方式,用各种语言编写的DLL都可以相互调用。
譬如Windows提供的系统DLL(其中包括了Windows的API),在任何开发环境中都能被调用,不在乎其是Visual Basic、Visual C++还是Delphi。
(2)动态链接库随处可见我们在Windows目录下的system32文件夹中会看到kernel32.dll、user32.dll 和gdi32.dll,windows的大多数API都包含在这些DLL中。
kernel32.dll中的函数主要处理内存管理和进程调度;user32.dll中的函数主要控制用户界面;gdi32.dll中的函数则负责图形方面的操作。
一般的程序员都用过类似MessageBox的函数,其实它就包含在user32.dll 这个动态链接库中。
由此可见DLL对我们来说其实并不陌生。
(3)VC动态链接库的分类Visual C++支持三种DLL,它们分别是Non-MFC DLL(非MFC动态库)、MFC Regular DLL(MFC规则DLL)、MFC Extension DLL(MFC扩展DLL)。
VC++动态链接库(DLL)编程深入浅出(全)
3.库的调试与查看
在具体进入各类 DLL 的详细阐述之前,有必要对库文件的调试与查看方法 进行一下介绍,因为从下一节开始我们将面对大量的例子工程。
由于库文件不能单独执行,因而在按下 F5(开始 debug 模式执行)或 CTRL+F5(运行)执行时,其弹出如图 3 所示的对话框,要求用户输入可执行文 件的路径来启动库函数的执行。这个时候我们输入要调用该库的 EXE 文件的路径 就可以对库进行调试了,其调试技巧与一般应用工程的调试一样。
图 3 库的调试与“运行” 通常有比上述做法更好的调试途径,那就是将库工程和应用工程(调用库 的工程)放置在同一 VC 工作区,只对应用工程进行调试,在应用工程调用库中 函数的语句处设置断点,执行后按下 F11,这样就单步进入了库中的函数。第 2 节中的 libTest 和 libCall 工程就放在了同一工作区,其工程结构如图 4 所示。
一般的程序员都用过类似 MessageBox 的函数,其实它就包含在 user32.dll 这个动态链接库中。由此可见 DLL 对我们来说其实并不陌生。
(3)VC 动态链接库的分类 Visual C++支持三种 DLL,它们分别是 Non-MFC DLL(非 MFC 动态库)、MFC Regular DLL(MFC 规则 DLL)、MFC Extension DLL(MFC 扩展 DLL)。
如图 6,在 VC++中 new 一个 Win32 Dynamic-Link Library 工程 dllTest (单击此处下载本工程附件)。注意不要选择 MFC AppWizard(dll),因为用 MFC AppWizard(dll)建立的将是第 5、6 节要讲述的 MFC 动态链接库。
静态链接库与动态链接库
静态链接库与动态链接库静态链接库与动态链接库2010-12-31 20:56:24| 分类:windows程序设计 |举报 |字号订阅⼀、介绍本⽂意在讲解静态链接库与动态链接库的创建与使⽤,在此之前先来对⼆者的概念、区别及优缺点进⾏简要的阐述。
其中⼤多内容参考相关⽹络资料,由于本⼈能⼒有限,不能确保完全准确⽆误,若有偏差之处请不吝指出。
⽂中使⽤到的代码均在Visual Studio 2008中编译通过,如果您使⽤的IDE与本⽂不同,可根据实际情况进⾏相应项⽬创建与操作。
希望本⽂内容对您有所帮助。
⼆、概念定义1. 分别编译与链接⼤多数⾼级语⾔都⽀持分别编译(Compiling),程序员可以显式地把程序划分为独⽴的模块或⽂件,然后由编译器(Compiler)对每个独⽴部分分别进⾏编译。
在编译之后,由链接器(Linker)把这些独⽴编译单元链接(Linking)到⼀起。
链接⽅式分为两种:(1) 静态链接⽅式:在程序开发中,将各种⽬标模块(.OBJ)⽂件、运⾏时库(.LIB)⽂件,以及经常是已编译的资源(.RES)⽂件链接在⼀起,以便创建Windows的.EXE⽂件。
(2) 动态链接⽅式:在程序运⾏时,Windows把⼀个模块中的函数调⽤链接到库模块中的实际函数上的过程。
2. 静态链接库与动态链接库静态链接库(Static Library,简称LIB)与动态链接库(Dynamic Link Library,简称DLL)都是共享代码的⽅式。
如果使⽤静态链接库(也称静态库),则⽆论你愿不愿意,.LIB⽂件中的指令都会被直接包含到最终⽣成的.EXE⽂件中。
但是若使⽤.DLL⽂件,该.DLL⽂件中的代码不必被包含在最终的.EXE⽂件中,.EXE⽂件执⾏时可以“动态”地载⼊和卸载这个与.EXE⽂件独⽴的.DLL⽂件。
2.1. 动态链接⽅式链接⼀个DLL有两种⽅式:2.1.1 载⼊时动态链接(Load-Time Dynamic Linking)使⽤载⼊时动态链接,调⽤模块可以像调⽤本模块中的函数⼀样直接使⽤导出函数名调⽤DLL中的函数。
动态库和静态库
xianga…11月23日正文字体大小:大中小静态库与动态库的建立与使用(2011-11-03 13:27:55)转载▼分类:C/C标签:杂谈转《深入浅出Visual C++动态链接库编程》作者宋宝华静态链接库就是你使用的.lib文件,库中得代码最后需要连接到你的可执行文件中去,所以静态连接的可执行文件一般比较大一些。
引用:一、通用:格式如:#pragma comment(lib,"XXX.lib") //指定与静态库一起连接二、针对开发环境:1、如果使用VC,可以在Project Setting-->Link中加入你的静态库,也可以直接把该.lib 文件加入到你的工程中2、如果使用Visual Studio,位置在项目→配置属性→连接器→输入→附加依赖项中加入.lib文件静态链接库不同于动态链接库(*.dll),在静态库情况下,函数和数据被编译进一个二进制文件(通常扩展名为*.LIB),Visual C++的编译器在链接过程中将从静态库中恢复这些函数和数据并把他们和应用程序中的其他模块组合在一起生成可执行文件。
这个过程称为"静态链接",此时因为应用程序所需的全部内容都是从库中复制了出来,所以静态库本身并不需要与可执行文件一起发行。
静态链接库对静态链接库的讲解不是本文的重点,但是在具体讲解DLL之前,通过一个静态链接库的例子可以快速地帮助我们建立“库”的概念。
图1 建立一个静态链接库如图1,在VC++6.0中new一个名称为libTest的static library工程(单击此处下载本工程附件),并新建lib.h和lib.cpp两个文件,lib.h和lib.cpp的源代码如下://文件:lib.h#ifndef LIB_H#define LIB_Hextern "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的功能。
c语言编译的链接文件解析
c语言编译的链接文件解析C语言编译的链接文件解析一、引言在C语言编程中,链接是将多个目标文件合并为一个可执行文件的过程。
链接文件的作用是将程序中的各个模块进行组合,解决模块之间的引用关系,使得程序能够正确地运行。
本文将介绍C语言编译的链接文件解析的相关知识。
二、链接的基本概念链接是将编译器生成的目标文件与库文件进行合并,生成可执行文件的过程。
链接分为静态链接和动态链接两种方式。
1. 静态链接静态链接是将所有的目标文件和库文件的代码和数据合并到一个可执行文件中。
在静态链接的过程中,连接器将目标文件中的符号引用与符号定义进行匹配,将符号引用替换为符号定义的地址,最终生成可执行文件。
静态链接的优点是生成的可执行文件独立存在,不依赖于其他文件;缺点是可执行文件的体积比较大。
2. 动态链接动态链接是在运行时将目标文件和库文件的代码和数据加载到内存中,生成可执行文件的过程。
在动态链接的过程中,连接器只处理符号引用与符号定义的匹配关系,生成一个包含符号引用的表格。
在程序运行时,操作系统根据这个表格将符号引用替换为符号定义的地址。
动态链接的优点是可执行文件的体积小,共享库可以被多个程序共享;缺点是程序依赖于共享库,如果共享库缺失或版本不兼容,程序将无法运行。
三、链接文件的结构链接文件一般包含以下几个部分:1. 文件头(File Header):记录了链接文件的一些基本信息,如文件的魔数、版本号等。
2. 段表(Section Header Table):记录了链接文件中各个段的信息,如段的起始地址、大小等。
3. 符号表(Symbol Table):记录了链接文件中定义和引用的符号的信息,如符号的名称、类型、地址等。
4. 重定位表(Relocation Table):记录了链接文件中需要进行重定位的位置和相关信息,用于将目标文件中的符号引用替换为符号定义的地址。
5. 字符串表(String Table):记录了链接文件中使用的字符串,如符号的名称、段的名称等。
C++之动态链接库和静态链接库
2015-8-23
最近工作中接触到了 C++动态链接库,一开始搞不明白,在网上查阅了很多 资料,现在对这些知识进行归纳总结。本文章一部分来自网上别人的文章,我会在 结尾注明,一部分来自我的理解。本文主要包括以下几个部分:
1.动态链接库和静态链接库简介 2.动态链接库的创建和调用 3.静态链接库的创建和调用
-6-
静态链接库不需要添加修饰符”_declspec(dllexport)”; 在新建的工程中添加类的实现文件”funcs.cpp”,输入的内容和创建动态链接库时出 入的内容一样; 点击”BUILD->Build Solution”进行编译,编译通过的话,将工程切换至 Release 状 态,再点击”BUILD->Build Solution”进行编译。此时一个简单的静态链接库创建完 成,在目录”Funcs\Release”下就可以找到”Funcs.lib”文件。
If(0==b) Return 0;
Return (a/b); }
点击”BUILD->Build Solution”进行编译,编译通过的话,将工程切换至 Release 状 态,再点击”BUILD->Build Solution”进行编译。此时一个简单的动态链接库创建完 成,在目录”Funcs\Release”下就可以找到”Funcs.dll”和”Funcs.lib”文件。
Return (a+b); } double myFuncs::Subtract(double a,double b) {
Return (a-b); }
-3-
double myFuncs::Multiply(double a,double b) {
VC++动态链接库创建和调用全过程详细讲解
1.概论先来阐述一下DLL(Dynamic Linkable Library)的概念.你可以简单的把DLL看成一种仓库.它提供给你一些可以直接拿来用的变量、函数或类。
在仓库的发展史上经历了“无库-静态链接库-动态链接库”的时代。
静态链接库与动态链接库都是共享代码的方式.如果采用静态链接库.则无论你愿不愿意.lib中的指令都被直接包含在最终生成的EXE文件中了。
但是若使用DLL.该DLL不必被包含在最终EXE文件中.EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL 文件。
静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库.而在动态链接库中还可以再包含其他的动态或静态链接库。
对动态链接库.我们还需建立如下概念:(1)DLL 的编制与具体的编程语言及编译器无关只要遵循约定的DLL接口规范和调用方式.用各种语言编写的DLL都可以相互调用。
譬如Windows提供的系统DLL(其中包括了Windows的API).在任何开发环境中都能被调用.不在乎其是Visual Basic、Visual C++还是Delphi。
(2)动态链接库随处可见我们在Windows目录下的system32文件夹中会看到kernel32.dll、user32.dll和gdi32.dll.windows的大多数API都包含在这些DLL中。
kernel32.dll中的函数主要处理内存管理和进程调度;user32.dll中的函数主要控制用户界面;gdi32.dll中的函数则负责图形方面的操作。
一般的程序员都用过类似MessageBox的函数.其实它就包含在user32.dll这个动态链接库中。
由此可见DLL对我们来说其实并不陌生。
(3)VC动态链接库的分类Visual C++支持三种DLL.它们分别是Non-MFC DLL(非MFC动态库)、MFC Regular DLL (MFC规则DLL)、MFC Extension DLL(MFC扩展DLL)。
VC++动态链接库编程
VC++动态链接库编程之基础慨念/lesson/318/2166818.shtml1.概论先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL 看成一种仓库,它提供给你一些可以直接拿来用的变量、函数或类。
在仓库的发展史上经历了“无库-静态链接库-动态链接库”的时代。
静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了。
但是若使用DLL,该DLL不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE 独立的DLL文件。
静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。
对动态链接库,我们还需建立如下概念:(1)DLL 的编制与具体的编程语言及编译器无关只要遵循约定的DLL接口规范和调用方式,用各种语言编写的DLL都可以相互调用。
譬如Windows提供的系统DLL(其中包括了Windows的API),在任何开发环境中都能被调用,不在乎其是Visual Basic、Visual C++还是Delphi。
(2)动态链接库随处可见我们在Windows目录下的system32文件夹中会看到kernel32.dll、user32.dll和gdi32.dll,windows的大多数API都包含在这些DLL中。
kernel32.dll 中的函数主要处理内存管理和进程调度;user32.dll中的函数主要控制用户界面;gdi32.dll中的函数则负责图形方面的操作。
一般的程序员都用过类似MessageBox的函数,其实它就包含在user32.dll 这个动态链接库中。
由此可见DLL对我们来说其实并不陌生。
(3)VC动态链接库的分类Visual C++支持三种DLL,它们分别是Non-MFC DLL(非MFC动态库)、MFC Regular DLL(MFC规则DLL)、MFC Extension DLL(MFC扩展DLL)。
静态链接库与动态链接库
静态链接库的生成使用:
• 静态链接库在编写运行成功后会生成一个.lib文件, 在需要调用静态库的项目使用静态库时,需要将生成静态 库的头文件.h文件和.lib文件同时放在项目文件目录下(头 文件也可以写绝对地址,如: #include"E:\Cfile\funlib1\funlib1\funlib1.h";库文件也可以 在:项目-xx(项目)属性-VC++目录-库目录 中添加.lib文 件的路径),项目中还需要加载.h文件,在.cpp文件中调 用该头文件。 • 库函数中需要用到的函数,需要在头文件或者源文件 中声明,再加上链接库语句:#pragma comment(lib,"lib001.lib")就可以使用了,当使用绝对路径 时,如:#pragma comment(lib,"E:\\Cfile\\fundll1\\Debug\\fundll1.lib") 就不 需要在项目中添加路径了。
•
• • •
动态链接库:
• 在程序装载内存的时候,才真正的链接库函数代码, 进行确定它们的地址,即使有几个程序同时运行,内存中 也只有存在一份函数代码。 • 动态装载分为两类。 • 静态绑定,程序开始载入内存的时候,载入程序会把 所有调用到的动态代码的地址算出来,确定下来,此方式 初始化时间较长,完成动态装载后,运行速度很快。 • 动态绑定,需要调用的动态库代码,载入程序才会计 算动态代码的逻辑地址。初始化时间短,运行期间性能不 及静态绑定的程序。
动态链接库的使用:
• 调用动态链接库函数时需要将生成的.lib文件和.dll文 件都放入项目文件目录下(lib文件也可以在项目-xx(项 目)属性-VC++目录-库目录 中添加;dll文件需要放到exe 文件同目录下,或者放入系统盘的windows文件夹中), 除了上面提到的声明函数还需要 “#pragma comment(lib,"lib002.lib")”语句(当使用绝对路 径时,如: #pragma comment(lib,"E:\\Cfile\\fundll1\\Debug\\fundll1.lib") 就不 需要在项目中添加路径了),用于链接引入库文件,就可 以调用动态链接库了
VC++动态链接库(DLL)编程深入浅出(三)
VC++动态链接库(DLL)编程深⼊浅出(三)前⾯我们对⾮MFC DLL进⾏了介绍,这⼀节将详细地讲述MFC规则DLL的创建与使⽤技巧。
另外,⾃从本⽂开始连载后,收到了⼀些读者的e-mail。
有的读者提出了⼀些问题,笔者将在本⽂的最后⼀次连载中选取其中的典型问题进⾏解答。
由于时间的关系,对于读者朋友的来信,笔者暂时不能⼀⼀回复,还望海涵!由于笔者的⽔平有限,⽂中难免有错误和纰漏,也热诚欢迎读者朋友不吝指正! 5. MFC规则DLL 5.1 概述 MFC规则DLL的概念体现在两⽅⾯: (1)它是MFC的 “是MFC的”意味着可以在这种DLL的内部使⽤MFC; (2)它是规则的 “是规则的”意味着它不同于MFC扩展DLL,在MFC规则DLL的内部虽然可以使⽤MFC,但是其与应⽤程序的接⼝不能是MFC。
⽽MFC 扩展DLL与应⽤程序的接⼝可以是MFC,可以从MFC扩展DLL中导出⼀个MFC类的派⽣类。
Regular DLL能够被所有⽀持DLL技术的语⾔所编写的应⽤程序调⽤,当然也包括使⽤MFC的应⽤程序。
在这种动态连接库中,包含⼀个从CWinApp继承下来的类,DllMain函数则由MFC⾃动提供。
Regular DLL分为两类: (1)静态链接到MFC 的规则DLL 静态链接到MFC的规则DLL与MFC库(包括MFC扩展 DLL)静态链接,将MFC库的代码直接⽣成在.dll⽂件中。
在调⽤这种DLL的接⼝时,MFC使⽤DLL的资源。
因此,在静态链接到MFC 的规则DLL中不需要进⾏模块状态的切换。
使⽤这种⽅法⽣成的规则DLL其程序较⼤,也可能包含重复的代码。
(2)动态链接到MFC 的规则DLL 动态链接到MFC 的规则DLL 可以和使⽤它的可执⾏⽂件同时动态链接到 MFC DLL 和任何MFC扩展 DLL。
在使⽤了MFC共享库的时候,默认情况下,MFC使⽤主应⽤程序的资源句柄来加载资源模板。
VC中静态链接库、动态链接库编程深入浅出详解
VC++动态链接库(DLL)编程深入浅出(一)1.概论先来阐述一下D LL(Dynamic Linkabl e Library)的概念,你可以简单的把DLL 看成一种仓库,它提供给你一些可以直接拿来用的变量、函数或类。
在仓库的发展史上经历了“无库-静态链接库-动态链接库”的时代。
[被屏蔽广告] 静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都被直接包含在最终生成的 EXE 文件中了。
但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE 独立的 DLL 文件。
静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。
对动态链接库,我们还需建立如下概念:(1)DLL 的编制与具体的编程语言及编译器无关只要遵循约定的DLL 接口规范和调用方式,用各种语言编写的 DLL 都可以相互调用。
譬如 Windows提供的系统 DLL(其中包括了 Windows的 API),在任何开发环境中都能被调用,不在乎其是 VisualBasic、VisualC++还是 Delphi。
(2)动态链接库随处可见我们在 Windows目录下的 system32 文件夹中会看到kernel32.dll、user32.dll 和 gdi32.dll,windows的大多数 API 都包含在这些DLL 中。
kernel32.dll 中的函数主要处理内存管理和进程调度;user32.dll 中的函数主要控制用户界面;gdi32.dll 中的函数则负责图形方面的操作。
一般的程序员都用过类似 Message Box 的函数,其实它就包含在user32.dll这个动态链接库中。
VC静态库与动态库的加载
WIN_静态库与动态库的加载一. 静态库包括.lib和.h文件,在工程中使用静态库分为3步:<1> 在工程中加入静态库,有两种方法:**方法一:项目设置中引用.lib,project-> setting-> link-> object/library modules 中添加.lib;(需要在tools/options设置正确的引用路径)**方法二:在项目中直接加入lib,project-> add to project-> files,选择正确的.lib。
**方法三:pragma comment(lib, "##/##/mine.lib") ,路径名,系统会优先查找环境path<2> 在工程中包括.h文件;(可能需要在tools/options设置正确的引用路径)<3> 在工程中使用静态库中的函数;二. 动态链接库一般包括.lib(导入库),.h,.dll文件,使用动态库有两种情况:A . 隐式链接:load-time dynamic linking同使用静态库相似,分为三步:引用.lib导入库,包含头文件,使用导出函数;此种方法的好处是:可以像使用静态库一样直接调用函数缺点:程序启动时加载所有需要的DLL,延长启动时间,效率低。
B. 动态加载:run-time dynamic linking直接使用LoadLibrary或LoadLibraryEx 加载所需的动态库(并不需要对应的头文件,和LIB),然后指定所需的导出函数,效率最高!,但前提需要对DLL库有比较详细的了解。
缺点:需要使用GetProcessAddress()得到函数指针,函数调用相对麻烦。
基本概念:目标库(静态库):扩展名.lib,静态连接,其代码会加入到可执行程序中。
动态库:扩展名.dll,动态链接,发生在运行时。
输入库(导入库):扩展名.lib,目标库的一种特殊形式。
VC随笔动态链接库
VC随笔动态链接库动态链接库与静态链接库:1、静态链接库对开发人员来说,调用静态链接库中的函数和调用当前工程中的全局函数没有什么区别,唯一不同的是有可能看不到链接库中函数的源代码(如果没有提供的话)。
用户在交付最终静态链接库时,只需要提供.lib文件和相应的头文件,不需要再提供库的源代码。
在需要使用静态库的工程中,包含相应的头文件,并把.lib文件加入工程中就可以了。
2、动态链接库动态链接库就是程序运行时由该程序动态链接调用的函数库,是一些函数、数据和类集合成的可执行模块,程序员可以将动态链接库动态地集成到自己的程序中以使用库中的函数、数据和类。
3、区别动态链接发生在程序运行时,动态链接的函数代码不出现在程序的EXE文件中,它仅仅包含了应用程序运行过程中所调用的DLL函数的一些最基本信息(例如DLL文件位置、函数名等);而静态链接发生在编译时,静态链接的函数代码实际被插入到程序的EXE文件中。
4、在一些情况下,必须使用动态链接库:(1)多个应用程序共享代码和数据(2)在各子程序过滤系统消息时必须使用动态链接库(3)设备驱动程序必须是动态链接库(4)在对话框编辑器中使用自己定义的控件,也必须使用动态链接库(5)为了实现应用程序的国际化,往往需要使用动态链接库动态链接库类型:1、Win32 DLL指不使用MFC类库创建的DLL。
Win32 DLL中的导出函数通常使用标准的C接口,这些函数可以被MFC或非MFC应用程序调用。
2、MFC常规DLLMFC常规DLL可以使用MFC来创建,可以导出C风格的函数,但不能导出C++类、成员函数或重载函数。
它们可以被MFC或非MFC应用程序调用。
但这种类型的DLL不能向应用程序传递MFC对象指针,必须使用MFC扩展DLL。
MFC常规DLL按照与MFC的链接方式又分动态链接和静态链接两种。
3、MFC扩展DLL表面上更像应用程序而不像一组函数的集合,因为它可以创建MFC派生类。
VC静态链接库的编写和动态链接库的区别
例:在VC6.0中选择下图的工程:在静态库的头文件中写下如下代码:#ifndef __LIB__H#define __LIB__Hextern "C" int add(int a,int b);#endif在CPP文件中#include "lib.h"int add(int a,int b){return a + b;}以上就是静态库的编写;在你要调用的程序中:#pragma comment(lib, "lib.lib")#include "Lib.h"#include <iostream>using namespace std;void main(){int sum;sum = add(3,5);cout << "sum = " << sum <<endl;}整个静态链接库的调用就完成了,下面分享下在网上找的一编文章:静态链接库静态链接库就是你使用的.lib文件,库中得代码最后需要连接到你的可执行文件中去,所以静态连接的可执行文件一般比较大一些。
引用:一、通用:格式如:#pragma comment(lib,"XXX.lib")二、针对开发环境:1、如果使用VC,可以在Project Setting-->Link中加入你的静态库,也可以直接把该.lib文件加入到你的工程中2、如果使用Visual Studio,位置在项目→配置属性→连接器→输入→附加依赖项中加入.lib文件静态链接库不同于动态链接库(*.dll),在静态库情况下,函数和数据被编译进一个二进制文件(通常扩展名为*.LIB),Visual C++的编译器在链接过程中将从静态库中恢复这些函数和数据并把他们和应用程序中的其他模块组合在一起生成可执行文件。
这个过程称为"静态链接",此时因为应用程序所需的全部内容都是从库中复制了出来,所以静态库本身并不需要与可执行文件一起发行。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
VC++动态链接库(DLL)编程深入浅出(一)1.概论先来阐述一下 DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL 看成一种仓库,它提供给你一些可以直接拿来用的变量、函数或类。
在仓库的发展史上经历了“无库-静态链接库-动态链接库”的时代。
[被屏蔽广告] 静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都被直接包含在最终生成的 EXE 文件中了。
但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE 独立的 DLL 文件。
静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。
对动态链接库,我们还需建立如下概念:(1)DLL 的编制与具体的编程语言及编译器无关只要遵循约定的 DLL 接口规范和调用方式,用各种语言编写的 DLL 都可以相互调用。
譬如 Windows 提供的系统 DLL(其中包括了 Windows 的 API),在任何开发环境中都能被调用,不在乎其是 Visual Basic、Visual C++还是 Delphi。
(2)动态链接库随处可见我们在 Windows 目录下的 system32 文件夹中会看到kernel32.dll、user32.dll 和 gdi32.dll,windows 的大多数 API 都包含在这些DLL 中。
kernel32.dll 中的函数主要处理内存管理和进程调度;user32.dll 中的函数主要控制用户界面;gdi32.dll 中的函数则负责图形方面的操作。
一般的程序员都用过类似 MessageBox 的函数,其实它就包含在 user32.dll这个动态链接库中。
由此可见 DLL 对我们来说其实并不陌生。
(3)VC 动态链接库的分类Visual C++支持三种 DLL,它们分别是 Non-MFC DLL(非 MFC 动态库)、MFC Regular DLL(MFC 规则 DLL)、MFC Extension DLL(MFC 扩展 DLL)。
非 MFC 动态库不采用 MFC 类库结构,其导出函数为标准的 C 接口,能被非MFC 或 MFC 编写的应用程序所调用;MFC 规则 DLL 包含一个继承自 CWinApp 的类,但其无消息循环;MFC 扩展 DLL 采用 MFC 的动态链接版本创建,它只能被用 MFC 类库所编写的应用程序所调用。
由于本文篇幅较长,内容较多,势必需要先对阅读本文的有关事项进行说明,下面以问答形式给出。
问:本文主要讲解什么内容?答:本文详细介绍了 DLL 编程的方方面面,努力学完本文应可以对 DLL 有较全面的掌握,并能编写大多数 DLL 程序。
问:如何看本文?答:本文每一个主题的讲解都附带了源代码例程,可以随文下载(每个工程都经 WINRAR 压缩)。
所有这些例程都由笔者编写并在 VC++6.0 中调试通过。
当然看懂本文不是读者的最终目的,读者应亲自动手实践才能真正掌握DLL 的奥妙。
问:学习本文需要什么样的基础知识?答:如果你掌握了 C,并大致掌握了 C++,了解一点 MFC 的知识,就可以轻松地看懂本文。
2.静态链接库对静态链接库的讲解不是本文的重点,但是在具体讲解 DLL 之前,通过一个静态链接库的例子可以快速地帮助我们建立“库”的概念。
图 1 建立一个静态链接库如图 1,在 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 一起连接。
如果不用#pragma comment 指定,则可以直接在 VC++中设置,如图 2,依次*选择 tools、options、directories、library files 菜单或选项,填入库文件路径。
图 2 中加红圈的部分为我们添加的 libTest.lib 文件的路径。
图 2 在 VC 中设置库文件路径这个静态链接库的例子至少让我们明白了库函数是怎么回事,它们是哪来的。
我们现在有下列模糊认识了:(1)库不是个怪物,编写库的程序和编写一般的程序区别不大,只是库不能单独执行;(2)库提供一些可以给别的程序调用的东东,别的程序要调用它必须以某种方式指明它要调用之。
以上从静态链接库分析而得到的对库的懵懂概念可以直接引申到动态链接库中,动态链接库与静态链接库在编写和调用上的不同体现在库的外部接口定义及调用方式略有差异。
3.库的调试与查看在具体进入各类 DLL 的详细阐述之前,有必要对库文件的调试与查看方法进行一下介绍,因为从下一节开始我们将面对大量的例子工程。
由于库文件不能单独执行,因而在按下 F5(开始 debug 模式执行)或CTRL+F5(运行)执行时,其弹出如图 3 所示的对话框,要求用户输入可执行文件的路径来启动库函数的执行。
这个时候我们输入要调用该库的 EXE 文件的路径就可以对库进行调试了,其调试技巧与一般应用工程的调试一样。
图 3 库的调试与“运行”通常有比上述做法更好的调试途径,那就是将库工程和应用工程(调用库的工程)放置在同一 VC 工作区,只对应用工程进行调试,在应用工程调用库中函数的语句处设置断点,执行后按下 F11,这样就单步进入了库中的函数。
第 2节中的 libTest 和 libCall 工程就放在了同一工作区,其工程结构如图 4 所示。
图 4 把库工程和调用库的工程放入同一工作区进行调试上述调试方法对静态链接库和动态链接库而言是一致的。
所以本文提供下载的所有源代码中都包含了库工程和调用库的工程,这二者都被包含在一个工作区内,这是笔者提供这种打包下载的用意所在。
动态链接库中的导出接口可以使用 Visual C++的 Depends 工具进行查看,让我们用 Depends 打开系统目录中的 user32.dll,看到了吧?红圈内的就是几个版本的 MessageBox 了!原来它真的在这里啊,原来它就在这里啊!图 5 用 Depends 查看 DLL当然 Depends 工具也可以显示 DLL 的层次结构,若用它打开一个可执行文件则可以看出这个可执行文件调用了哪些 DLL。
好,让我们正式进入动态链接库的世界,先来看看最一般的 DLL,即非 MFC DLL(待续...)VC++动态链接库(DLL)编程深入浅出(二)上节给大家介绍了静态链接库与库的调试与查看(动态链接库 (DLL)编程深入浅出 (一 )),本节主要介绍非 MFC DLL。
4.非 MFC DLL4.1 一个简单的 DLL第 2 节给出了以静态链接库方式提供 add 函数接口的方法,接下来我们来看看怎样用动态链接库实现一个同样功能的 add 函数。
如图 6,在 VC++中 new 一个 Win32 Dynamic-Link Library 工程 dllTest (单击此处下载本工程附件)。
注意不要选择 MFC AppWizard(dll),因为用 MFC AppWizard(dll)建立的将是第 5、6 节要讲述的 MFC 动态链接库。
图 6建立一个非 MFC DLL在建立的工程中添加 lib.h 及 lib.cpp 文件,源代码如下:/*文件名:lib.h */#ifndef LIB_H#define LIB_H**extern "C" int __declspec(dllexport)add(int x, int y); #endif/*文件名:lib.cpp */*#include "lib.h"int add(int x, int y){return x + y;}与第 2 节对静态链接库的调用相似,我们也建立一个与 DLL 工程处于同一工作区的应用工程 dllCall,它调用 DLL 中的函数 add,其源代码如下:*#include <stdio.h>*#include <windows.h>*typedef int(*lpAddFun)(int, int); //宏定义函数指针类型*int main(int argc, char *argv[]){*HINSTANCE hDll; //DLL 句柄*lpAddFun addFun; //函数指针*hDll = LoadLibrary("..\\Debug\\dllTest.dll");*if (hDll != NULL){**addFun = (lpAddFun)GetProcAddress(hDll, "add"); *if (addFun != NULL){*int result = addFun(2, 3);printf("%d", result);}FreeLibrary(hDll);}*return 0;}分析上述代码,dllTest 工程中的 lib.cpp 文件与第 2 节静态链接库版本完全相同,不同在于 lib.h 对函数 add 的声明前面添加了__declspec(dllexport)语句。