动态库和静态库

上传人:ni****g 文档编号:456673858 上传时间:2023-06-14 格式:DOCX 页数:7 大小:282.03KB
返回 下载 相关 举报
动态库和静态库_第1页
第1页 / 共7页
动态库和静态库_第2页
第2页 / 共7页
动态库和静态库_第3页
第3页 / 共7页
动态库和静态库_第4页
第4页 / 共7页
动态库和静态库_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《动态库和静态库》由会员分享,可在线阅读,更多相关《动态库和静态库(7页珍藏版)》请在金锄头文库上搜索。

1、xianga.11 月 23 日正文 字体大小:大 中 小静态库与动态库的建立与使用(2011-11-03 13:27:55)转载标签:分类:C/C杂谈转 深入浅出Visual C+动态链接库编程作者 宋宝华静态链接库就是你使用的ib文件,库中得代码最后需要连接到你的可执行文件中去,所以 静态连接的可执行文件一般比较大一些。引用:一、通用:格式如: #pragma comment(lib,XXX.lib) /指定与静态库一起连接二、针对开发环境:1、如果使用VC,可以在Project Setting->Link中加入你的静态库,也可以直接把该.lib 文件加入到你的工程中2、如果使用Vi

2、sual Studio,位置在项目T配置属性T连接器T输入T附加依赖项 中加 入.lib文件静态链接库不同于动态链接库(*.dll),在静态库情况下,函数和数据被编译进一个二 进制文件(通常扩展名为*丄旧),Visual C+的编译器在链接过程中将从静态库中恢复这些函 数和数据并把他们和应用程序中的其他模块组合在一起生成可执行文件。这个过程称为静 态链接,此时因为应用程序所需的全部内容都是从库中复制了出来,所以静态库本身并不 需要与可执行文件一起发行。静态链接库WurkupaiEEs I Qlhcr Dncunicnns|nVCPRUrCTVIbl|lb 1 eiilPra|/eEt n me

3、J |ihar!R|Ciealr rocww4rkufi*c ru1 il |U l.irJirnl WuJh 厂 pEii* mirf ncy al.对静态链接库的讲解不是本文的重点,但是在具体讲解DLL之前,通过一个静态链接库 的例子可以快速地帮助我们建立“库”的概念。AppWiaid Cluster Ac source 協唱伽 rm ApWIza-rd-itCcvSludic Add iftWi ifllSLftPlniiLnH Wijjirdl詔川机II上SMFC AdhneXCDinliDrVaanr ApjiWff-ird |dll|TE Ulflttv Prtik 曰二NinHZ

4、 Can-sale Appllchlnfl jj Win l? DynaFnilcLlnk Library tlWnJ? SEfldc UlkRiiy图 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

5、.hint add(int x,int y)return x + y;编译这个工程就得到了一个.lib文件,这个文件就是一个函数库,它提供了 add的功能。 将头文件和ib文件提交给用户后,用户就可以直接使用其中的add函数了。标准Turbo C2.0中的C库函数(我们用来的scanf、printf、memcpy、strcpy等)就来自 这种静态库。下面来看看怎么使用这个库,在 libTest 工程所在的工作区内 new 一个 libCall 工程。 libCall 工程仅包含一个main.cpp文件,它演示了静态链接库的调用方法,其源代码如下: #include #include .lib.

6、h#pragma comment( lib, .debuglibTest.lib )/指定与静态库一起连接int main(int argc, char* argv)printf( 2 + 3 = %d, add( 2, 3 ) );静态链接库的调用就是这么简单,或许我们每天都在用,可是我们没有明白这个概念 代码中#pragma comment( lib , ,.debuglibTest.lib)的意思是指本文件生成的.obj文件应与 libTest.lib 一起连接。如果不用#pragma comment指定,则可以直接在VC+中设置,如图2,依次选择tools、 options、 dire

7、ctories、 library files 菜单或选项,填入库文件路径。图 2 中加红圈的部分为我 们添加的libTest.lib文件的路径。图2在VC中设置库文件路径第一种引用方式,直接敲入代码,编译链接没有错误。第二种方式调用因为用的软件不一样会出现如下的错误:cc.obj: error LNK2001: unresolved external symbol _addDebug/cc.exe : fatal error LNK1120: 1 unresolved externals在工程设置里面链接栏添加自己生成的静态库,链接就不再出现错误了。直接COPY过来可能还会遇到这样的错误F:d

8、lltestlib.cpp(6) : error C2018: unknown character 0xa1这个错误的意思即有中文空格,VC的强大依然有不支持中文的地方,直接自己一个一个敲 进去就会没有问题。动态链接库英文为DLL,是Dynamic Link Library的缩写形式,DLL是一个包含可由多个程序 同时使用的代码和数据的库,DLL不是可执行文件。动态链接提供了一种方法,使进程可以 调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或 多个已被编译、链接并与使用它们的进程分开存储的函数。 DLL 还有助于共享数据和资源。 多个应用程序可同时访

9、问内存中单个 DLL 副本的内容。 DLL 是一个包含可由多个程序同时 使用的代码和数据的库。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类库所编写的应用程序所调 用。动态链接库建立:如图6,

10、在VC+中new 一个Win32 Dynamic-Link Library工程dllTest(单击此处下载本工程)。 注意不要选择MFC AppWizard(dll),因为用MFC AppWizard(dll)建立的将是第5、6节要讲述 的 MFC 动态链接库。图6建立一个非MFC DLL在建立的工程中添加lib.h及lib.cpp文件,源代码如下:编译组建则会生成dlltest.的劫态链接库。动态链接库的引用:首先,语句typedef int ( * lpAddFun)(定定义了一个与add函数接受参数类型和返回值均 相同的函数指针类型。随后,在main函数中定义了 lpAddFun的实例a

11、ddFun;其次,在函数main中定义了一个DLL HINSTANCE句柄实例hDl通过Win32 Api函数 LoadLibrar动态加载了 DLL模块并将DLL模块句柄赋给了 hDll再次,在函数main中通过Win32 Api函数GetProcAddresS得到了所加载DLL模块中函 数add的地址并赋给了 addFun。经由函数指针addFun进行了对DLL中add函数的调用;最后,应用工程使用完DLL后,在函数main中通过Win32 Api函数FreeLibrar释放了 已经加载的DLL模块。通过这个简单的例子,我们获知DLL定义和调用的一般概念:(1) DLL中需以某种特定的方式

12、声明导出函数(或变量、类);(2) 应用工程需以某种特定的方式调用DLL的导出函数(或变量、类)。下面我们来对“特定的方式进行”阐述。声明导出函数DLL 中导出函数的声明有两种方式:一种为 4.1节例子中给出的在函数声明中加上 _declspec(dllexpqr这里不再举例说明;另外一种方式是采用模块定义(.def)文件声明,def 文件为链接器提供了有关被链接程序的导出、属性及其他方面的信息。下面的代码演示了怎样同.def文件将函数add声明为DLL导出函数儒在dllTes工程中添加 lib.de文件):.def 文件的规则为:(1) LIBRARY语句说明.def文件相应的DLL;(2)

13、 EXP0RTS语句后列出要导出函数的名称。可以在.def文件中的导出函数名后加n, 表示要导出函数的序号为n (在进行函数调用时,这个序号将发挥其作用);(3) .def 文件中的注释由每个注释行开始处的分号 (;) 指定,且注释不能与语句共享一 行。由此可以看出,例子中lib.def文件的含义为生成名为dllTest”的动态链接库,导出其中 的add函数,并指定add函数的序号为1。DLL的调用方式动态调用在例子中我们看到了由“LoadLibrary-GetProcAddress-FreeLibrary”系统Api提供的三位一 体“DLL加载-DLL函数地址获取-DLL释放方式,这种调用方

14、式称为DLL的动态调用。动态调用方式的特点是完全由编程者用API函数加载和卸载DLL,程序员可以决定 DLL 文件何时加载或不加载,显式链接在运行时决定加载哪个 DLL 文件。 静态调用编译dllTest工程所生成的.lib和.dll文件拷入dllCall工程所在的路径,dllCall执行下列代码:由上述代码可以看出,静态调用方式的顺利进行需要完成两个动作:(1)告诉编译器与DLL相对应的.lib文件所在的路径及文件名,#pragma comment(lib,dllTest.lib)就是起这个作用。程序员在建立一个DLL文件时,连接器会自动为其生成一个对应的.lib文件,该文件包 含了 DLL

15、 导出函数的符号名及序号(并不含有实际的代码)。在应用程序里, .lib 文件将作 为 DLL 的替代文件参与编译。(2)声 明 导 入 函 数, extern C _declspec(dllimport) add(int x,int y) 语 句 中 的 _declspec(dllimport )发挥这个作用。静态调用方式不再需要使用系统API来加载、卸载DLL以及获取DLL中导出函数的地址。 这是因为,当程序员通过静态链接方式编译生成应用程序时,应用程序中调用的与lib文件 中导出符号相匹配的函数符号将进入到生成的EXE文件中,.lib文件中所包含的与之对应的 DLL 文件的文件名也被编译器存储在 EXE 文件内部。当应用程序运行过程中需要加载 DLL 文件时,Windows将根据这些信息发现并加载DLL,然后通过符号名实现对DLL函数的动态 链接。这样,EXE将能直接通过函数名调用DLL的输出函数,就象调用程序内部的其他函数 一样。分享:分享到新浪Qing0喜欢阅读(123) I评论丨收藏(0)丨转载(0)丨喜欢丨

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 建筑资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号