h头文件 .lib库文件 .dll动态链接库文件关系
- 格式:docx
- 大小:22.94 KB
- 文档页数:8
Matlab调⽤动态链接库matlab帮助⽂档⾥有详细⽂档Call Functions in shared Libaries什么是共享库共享库是⼀组函数的集合,在程序运⾏期间可以动态加载。
共享库中的函数可以⽤不同的语⾔实现,但只要这些函数提供了C语⾔接⼝,那Matlab就⽀持该共享库,⽽且Matlab ⽀持在不同平台下链接共享库。
平台共享库⽂件扩展名Micsoft Windows动态链接库⽂件.dllUNIX and Linus共享⽬标⽂件.soApple Macintosh动态共享⽂件.dylib共享库必须要提供⼀个头⽂件,⽤来声明共享库中的函数。
函数签名中明确了函数的名称,参数的个数和类型。
你还需要⼀个已安装好的matlab⽀持的C编译器。
matlab可以通过命令⾏接⼝调⽤外部共享库中的函数。
这个接⼝允许你将⼀个外部共享库加载到Matlab内存中,并调⽤共享库中的函数。
虽然matlab语⾔和C语⾔差异较⼤,但是通常你可以直接传递⼀个类型到C函数中,不需要做转换,因为matlab在后⾯已经帮你做好了这部分⼯作。
当你使⽤完了共享库,有个重点是你需要卸载共享库以释放内存。
加载和卸载共享库为了让matlab调⽤共享库中的函数,⾸先需要将共享库加载到内存中去,加载完之后,你可以获取库中的函数信息和直接在matlab中调⽤这些函数,当不再需要共享库时,还需要卸载共享库来维持内存使⽤情况。
加载共享库到matlab中,使⽤loadlibray函数,函数语法是:loadlibrary('shrlib','hfile')其中shrlib表⽰共享库⽂件的名称,hfile表⽰包含函数声明的头⽂件名称。
⽤unloadlibrary命令去卸载共享库并释放内存。
命令语法:unloadlibrary libname其中libname表⽰共享库名称。
查看共享库函数在命令⾏窗⼝中查看函数为了在命令⾏窗⼝中显⽰共享库中的函数信息,可以⽤libfunctions,例如,查看libmx共享库中有哪些可⽤的函数,可以输⼊如下命令:if not(libisloaded('libmx'))hfile = [matlabroot '\extern\include\matrix.h'];loadlibrary('libmx',hfile)endlibfunctions libmxmatlab命令⾏窗⼝中显⽰:MATLAB displays (in part):Functions in library libmx:mxAddField mxGetScalarmxArrayToString mxGetString_730mxCalcSingleSubscript_730 mxGetUserBitsmxCalloc mxIsCellmxCreateCellArray_730 mxIsCharmxCreateCellMatrix_730 mxIsClass. .. .. .如果想看具体的函数签名,在命令后加-full指令,这个选项能够显⽰matlab调⽤共享库中函数的语法,其中函数⽤的参数列表和返回类型均为matlab类型,⽽不是C版本的类型。
摘要:介绍了动态链接库这种模块复用方法及在VC中对它的调用,并给出了一个通过复用来实现数据加密的具体实例。
关键词:VC DLL 模块复用数据加密引言模块化思想贯穿于软件工程各个发展阶段,模块复用是构建大系统的一种重要思想。
模块复用方法有:函数、函数库、动态链接库、COM。
其都是基于模块化的基本思想。
函数是最简单的模块化思想,也是后面方法的基础,甚至是一个应用程序的基础。
函数库是函数的组合,一般将一些功能相似的函数放在一起作为函数库,这种函数库通常叫做静态库,其链接方式是静态的。
COM即组件对象模型,是一种集成技术,可以使程序在运行时把各种不相关的软件程序混合在一起,而不必考虑这些不相关的程序是用什么语言编写的,它也是一种标准或者称为协议,负责将一个软件模块和另一个软件连接起来。
动态链接库DLL(Dynamic Link Library)是一个可以被其它应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源,其链接方式是动态的。
动态链接库文件的扩展名一般是dll,也有可能是fon、sys和dry,它和可执行文件(.exe)非常相似,区别在于DLL中虽然包含了可执行代码却不能单独执行,而应由Windows应用程序直接或间接调用。
Windows操作系统包含大量动态链接库,其中最主要的是KERNEL32.DLL、USER32.DLL、GDI32.DLL 。
DLL的调用调用DLL,首先需要将DLL文件映像到用户进程的地址空间中,然后才能进行函数调用,这个函数和进程内部一般函数的调用方法相同。
Windows提供了两种将DLL映像到进程地址空间的方法:1、隐式的加载时链接这种方法需要DLL工程经编译产生的LIB文件,此文件中包含了DLL允许应用程序调用的所有函数的列表,当链接器发现应用程序调用了LIB文件列出的某个函数,就会在应用程序的可执行文件的文件映像中加入一些信息,这些信息指出了包含这个函数的DLL文件的名字。
Qt中添加静态库.lb,.a和动态库.dll,.so,头⽂件和.cpp⽂件添加步骤1.-Qt Creator中,"项⽬"------"添加库"2.把静态库和动态库⽂件放到项⽬⽂件夹中3.在.pro⽂件中会添加如下代码:- 添加动态库:如:lipsap.so (不需要添加路径)LIBS+=-LPWD/......l(指定库的名称)(熟悉Linux语⾔的知道,PWD是当前路径的意思)−添加静态库:(修改⼀下)如:halcon.awin32:LIBS+= PWD/lib....../-lhalcon (不⽤带后缀⽂件名)//项⽬⽂件夹的路径INCLUDEPATH+=$$PWD/include//头⽂件所在的路径DEPENDPATH+=$$PWD/include(添加过后会多两⾏.h⽂件的路径)如果是Linux操作系统,则是:linux:LIBS+= -L$$PWD/.....注意:⼀般.lib⽂件类似于.cpp⽂件,需要⼀个.h⽂件作为接⼝!因此添加.lib⽂件时是要有.h⽂件!⼀般.dll⽂件会有.lib⽂件和.h⽂件2个作为接⼝!因此要添加.h⽂件所在路径和.lib⽂件作为接⼝!4.添加.h和.cpp⽂件(完全开源的)- 先在项⽬⽂件中添加⼀个⽂件夹,include把.h和.cpp⽂件拷贝进去- 添加现有项⽬会发现.pro⽂件中SOURCES和HEADERS中⾃动添加了关于LIBS变量的说明-L 指定库名称-l 指定库名称(⼩写的l)⽆需后缀名,对.so,.a,.dll,.lib都适⽤如果不带-l,则带后缀名即:LIBS += -LD:/codetest/lib/-lws2_32等同于LIBS += D:/codetest/lib/ws2_32.lib也等同于LIBS += -L$$PWD/-lws2_32也等同于LIBS += -L$$PWD/ws2_32.libProcessing math: 100%。
vs2010下lib和dll文件的使用——笔记一、lib文件的简介.lib是一种文件后缀,是Windows操作系统的库文件,有静态lib和动态lib 之分:1)、静态lib文件:将导出的文件的声明和实现都放在lib文件中,此时lib 文件主要包含函数的实现部分(cpp文件),例如类的函数定义。
使用时只需配合相关的头文件,编译后程序将lib文件中的代码嵌入到宿主程序中,也就是最后的exe文件中,此时移除lib文件,程序可以正常运行,即编译后就不需要lib 文件的支持了。
2)、动态lib文件:相当于是一个h头文件,用于支持相应的dll文件的运行。
里面存储的是dll文件中各个导出函数的地址,达到链接主程序与dll文件的目的。
二、dll文件的生成vs2010生成dll文件,生成dll文件的时候需要对应的lib文件才能使用,dll生成方法如下(此处只是生成部分,在使用时还需修改):1)新建工程,选择“win32项目”,注意不是“win32控制台项目”,下一步选择生成dll文件,其余默认;2)添加需要封装的.cpp文件,并加入对应的.h文件,先说明类的封装(也就是类的cpp文件)头文件.hclass __declspec(dllexport) NB (类的头文件中只需修改此处即可){public:private:}其中关键字dllexport说明该类的实现部分需要导出。
源文件.cpp添加一句#include "stdafx.h"即可再说明一下一般函数的封装将函数的定义改为extern"C"__declspec(dllexport) float add(float a, float b);extern"C"__declspec(dllexport) float MIN(float a,float b);float MAX(float a,float b);函数MAX为导出到dll文件中,因此相当于不可见。
lib和dl l文件的区别和联系什么是lib文件,lib和dl l的关系如何(2008-04-18 19:44:37)(1)lib是编译时需要的,dll是运行时需要的。
如果要完成源代码的编译,有lib就够了。
如果也使动态连接的程序运行起来,有dll就够了。
在开发和调试阶段,当然最好都有。
(2)一般的动态库程序有li b文件和d ll文件。
lib文件是必须在编译期就连接到应用程序中的,而dll文件是运行期才会被调用的。
如果有dll文件,那么对应的l ib文件一般是一些索引信息,具体的实现在dll文件中。
如果只有li b文件,那么这个li b文件是静态编译出来的,索引和实现都在其中。
静态编译的l ib文件有好处:给用户安装时就不需要再挂动态库了。
但也有缺点,就是导致应用程序比较大,而且失去了动态库的灵活性,在版本升级时,同时要发布新的应用程序才行。
(3)在动态库的情况下,有两个文件,一个是引入库(.LIB)文件,一个是DLL文件,引入库文件包含被DLL导出的函数的名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到所需要使用的D LL文件,库中的函数和数据并不复制到可执行文件中,因此在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中所要调用的函数的内存地址,这样当一个或多个应用程序运行是再把程序代码和被调用的函数代码链接起来,从而节省了内存资源。
从上面的说明可以看出,DLL和.LIB文件必须随应用程序一起发行,否则应用程序将会产生错误。
一、开发和使用d ll需注意三种文件1、dll头文件它是指dll中说明输出的类或符号原型或数据结构的.h文件。
当其它应用程序调用dl l时,需要将该文件包含入应用程序的源文件中。
c++中.dll与.lib⽂件的⽣成与使⽤的详解两种库:• 包含了函数所在的DLL⽂件和⽂件中函数位置的信息(⼊⼝),代码由运⾏时加载在进程空间中的DLL提供,称为动态链接库dynamic link library。
• 包含函数代码本⾝,在编译时直接将代码加⼊程序当中,称为静态链接库static link library。
共有两种链接⽅式:• 动态链接使⽤动态链接库,允许可执⾏模块(.dll⽂件或.exe⽂件)仅包含在运⾏时定位DLL函数的可执⾏代码所需的信息。
• 静态链接使⽤静态链接库,链接器从静态链接库LIB获取所有被引⽤函数,并将库同代码⼀起放到可执⾏⽂件中。
两种⽂件的区别使⽤lib需注意两个⽂件:•.h头⽂件,包含lib中说明输出的类或符号原型或数据结构。
应⽤程序调⽤lib时,需要将该⽂件包含⼊应⽤程序的源⽂件中。
•.LIB⽂件。
使⽤dll需注意三个⽂件:•.h头⽂件,包含dll中说明输出的类或符号原型或数据结构的.h⽂件。
应⽤程序调⽤dll时,需要将该⽂件包含⼊应⽤程序的源⽂件中。
•.LIB⽂件,是dll在编译、链接成功之后⽣成的⽂件,作⽤是当其他应⽤程序调⽤dll时,需要将该⽂件引⼊应⽤程序,否则产⽣错误(如果不想⽤lib⽂件或者没有lib⽂件,可以⽤WIN32 API函数LoadLibrary、GetProcAddress装载)。
•dll⽂件,真正的可执⾏⽂件,开发成功后的应⽤程序在发布时,只需要有.exe⽂件和.dll⽂件,并不需要.lib⽂件和.h头⽂件。
1.⽣成lib⽂件 ⾸先,我们先建⽴⼀个控制台⼯程(新建->⼯程->控制台程序),添加sub.cpp以及sub.h⽂件。
//sub.h#ifndef _SUB_H#define _SUB_Hvoid sub(int a,int b);#endif//sub.cpp#include "sub.h"#include <iostream>void sub(int a,int b){std::cout<<(a-b)<<std::endl;}由于在⼯程中,没有main()函数,所以直接编译出错。
DLL的创建与调用1、DLL的概念DLL(Dynamic Linkable Library),动态链接库,可以向程序提供一些函数、变量或类。
这些可以直接拿来使用。
静态链接库与动态链接库的区别:(1)静态链接库与动态链接库都是共享代码的方式。
静态链接库把最后的指令都包含在最终生成的EXE 文件中了;动态链接库不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。
(2)静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。
动态链接库的分类: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类库所编写的应用程序所调用。
2、创建一个DLL2.1 非MFC的DLL2.1.1声明导出函数:extern “C” __declspec(dllexport) int add(int a, int b);其中extern “C”为声明为C编译。
由于C++编译器在编译的时候会造成其函数名的该变,在其他应用程序中导致函数不可调用,而C编译器则不会在编译后改变其函数名。
这样如果用C编译的程序来调用该dll中的函数时,可能会造成找不到该函数。
__declspec(dllexport)表示该函数为DLL输出函数,即其他应用程序可以调用该函数从dll中声明输出函数有两种方式:(1)另外一种方式是采用模块定义(.def) 文件声明,.def文件为链接器提供了有关被链接程序的导出、属性及其他方面的信息。
dll原理DLL原理动态链接库(Dynamic Link Library,简称DLL)是一种Windows 操作系统中常用的库文件,它可以被多个应用程序共享使用,从而避免了重复编写相同的代码。
本文将详细介绍DLL的原理。
一、静态链接与动态链接在介绍DLL原理之前,先来了解一下静态链接和动态链接。
1. 静态链接静态链接是指将程序所需要的库文件在编译时全部打包进可执行文件中。
这样做的好处是程序运行时不需要再加载外部库文件,因此速度较快。
但缺点也很明显,即可执行文件体积较大,在多个程序中使用相同的库时会造成重复浪费。
2. 动态链接动态链接是指在程序运行时才加载所需的库文件。
这样做的好处是节省了内存空间,并且多个程序可以共享同一个库文件。
但缺点也很明显,即运行速度较慢。
二、DLL概述1. DLL定义DLL是一个包含可由多个程序同时使用的代码和数据的库文件。
它可以被多个应用程序共享使用,从而避免了重复编写相同的代码。
2. DLL分类根据DLL所包含函数是否可以被其他应用程序调用,DLL可以分为两种类型:(1)导出函数的DLL导出函数的DLL是指将其中一些函数导出,以便其他应用程序可以调用这些函数。
这种DLL文件通常包含一组API(Application Programming Interface,应用程序编程接口)函数。
(2)内部使用的DLL内部使用的DLL是指不导出任何函数,只供当前进程中的其他模块使用。
这种DLL文件通常包含一些共享数据和实现某些功能的代码。
三、DLL加载过程1. 加载方式当一个应用程序需要调用一个DLL中的函数时,Windows操作系统会自动加载该DLL。
Windows操作系统有两种加载方式:(1)显式链接显式链接是指在编译时就将要使用的DLL文件名和需要调用的函数名写入源代码中,并在程序运行时由操作系统自动加载该DLL文件。
(2)隐式链接隐式链接是指在编译时不将要使用的DLL文件名和需要调用的函数名写入源代码中,而是在程序运行时由操作系统自动搜索并加载相应的DLL文件。
DLL (动态链接库)详解动态链接库英文为DLL,是Dynamic Link Library 的缩写形式,DLL 是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。
动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。
函数的可执行代码位于一个DLL 中,该DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。
DLL 还有助于共享数据和资源。
多个应用程序可同时访问内存中单个DLL 副本的内容。
DLL 是一个包含可由多个程序同时使用的代码和数据的库。
目录定义DLL 的优点DLL文件损坏DLL 依赖项导出DLL 函数DLL错误的危害DLL修复方法定义DLL 的优点DLL文件损坏DLL 依赖项导出DLL 函数DLL错误的危害DLL修复方法展开定义通过使用DLL,程序可以实现模块化,由相对独立的组件组成。
例如,一个计帐程序可以按模块来销售。
可以在运行时将各个模块加载到主程序中(如果安装了相应模块)。
因为模块是彼此独立的,所以程序的加载速度更快,而且模块只在相应的功能被请求时才加载。
此外,可以更为容易地将更新应用于各个模块,而不会影响该程序的其他部分。
例如,您有一个大型网络游戏,如果把整个数百MB甚至数GB的游戏的代码都放在一个应用程序里,日后的修改工作将会十分费时,而如果把不同功能的代码分别放在数个动态链接库(DLL)中,您无需重新生成或安装整个程序就可以应用更新。
下表说明了Windows 操作系统中的一些作为DLL 实现的文件:•ActiveX 控件(.ocx) 文件ActiveX 控件的一个示例是日历控件,它使您可以从日历中选择日期。
•控制面板(.cpl) 文件.cpl 文件的一个示例是位于控制面板中的项。
每个项都是一个专用DLL。
•设备驱动程序(.drv) 文件设备驱动程序的一个示例是控制打印到打印机的打印机驱动程序。
DLL 的优点1、扩展了应用程序的特性;2、可以用许多种编程语言来编写;3、简化了软件项目的管理;4、有助于节省内存;5、有助于资源共享;6、有助于应用程序的本地化;7、有助于解决平台差异;8、可以用于一些特殊的目的。
h头文件 .lib库文件 .dll动态链接库文件关系.h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的。
附加依赖项的是.lib不是.dll,若生成了DLL,则肯定也生成LIB文件。
如果要完成源代码的编译和链接,有头文件和lib就够了。
如果也使动态连接的程序运行起来,有dll就够了。
在开发和调试阶段,当然最好都有。
.h .lib .dll三者的关系是:H文件作用是:声明函数接口DLL文件作用是: 函数可执行代码当我们在自己的程序中引用了一个H文件里的函数,编链器怎么知道该调用哪个DLL文件呢?这就是LIB文件的作用: 告诉链接器调用的函数在哪个DLL中,函数执行代码在DLL中的什么位置,这也就是为什么需要附加依赖项 .LIB文件,它起到桥梁的作用。
如果生成静态库文件,则没有DLL ,只有lib,这时函数可执行代码部分也在lib文件中目前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Libary,以下简称“导入库”)。
静态库是一个或者多个obj文件的打包,所以有人干脆把从obj文件生成lib的过程称为Archive,即合并到一起。
比如你链接一个静态库,如果其中有错,它会准确的找到是哪个obj有错,即静态lib只是壳子。
动态库一般会有对应的导入库,方便程序静态载入动态链接库,否则你可能就需要自己LoadLibary调入DLL文件,然后再手工GetProcAddress获得对应函数了。
有了导入库,你只需要链接导入库后按照头文件函数接口的声明调用函数就可以了。
导入库和静态库的区别很大,他们实质是不一样的东西。
静态库本身就包含了实际执行代码、符号表等等,而对于导入库而言,其实际的执行代码位于动态库中,导入库只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息。
一般的动态库程序有lib文件和dll文件。
lib文件是必须在编译期就连接到应用程序中的,而dll文件是运行期才会被调用的。
如果有dll文件,那么对应的lib文件一般是一些索引信息,具体的实现在dll文件中。
如果只有lib文件,那么这个lib文件是静态编译出来的,索引和实现都在其中。
静态编译的lib文件有好处:给用户安装时就不需要再挂动态库了。
但也有缺点,就是导致应用程序比较大,而且失去了动态库的灵活性,在版本升级时,同时要发布新的应用程序才行。
在动态库的情况下,有两个文件,而一个是引入库(.LIB)文件,一个是DLL文件,引入库文件包含被DLL导出的函数的名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到所需要使用的DLL文件,库中的函数和数据并不复制到可执行文件中,因此在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中所要调用的函数的内存地址,这样当一个或多个应用程序运行是再把程序代码和被调用的函数代码链接起来,从而节省了内存资源。
从上面的说明可以看出,DLL和.LIB文件必须随应用程序一起发行,否则应用程序将会产生错误。
-------------------------------------------------------------------------------------静态链接库(Lib)与动态链接库(DLL)的区别(2009-03-06 12:53:39)转载标签:静态链接库lib动态链接库分类:编程技术dll区别it静态连接库就是把(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_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的功能。
将头文件和.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一起连接-------------------------------------------------------------------------------------------用VC++生成静态库文件今天闲着没事做,自己写了一点小笔记,不知道对于新手有没用,高手就不用看了,作为新手的我斗胆来发表一个笔记,就是静态库文件的封装过程,使用VC++6.0编写,下面是正文,也许我的用语并不专业以前我们写C/C++源文件的时候,都是先将各个写好的源文件编译,编译生成的是目标文件机器码,即.obj文件.(目标文件的扩展名不一定是.obj文件).我们调用的标准C/C++函数机器码实际被封装于标准C/C++静态库文件中的.即那些扩展名为.lib的文件中.最后链接器将我们编译的各个目标文件里的机器码和静态库(标准C/C++库)中的函数机器码链接到一起形成一个扩展名为.exe的可执行文件模块.在这里我们叙述将C/C++源文件编译链接成一个静态库文件,但它不是可执行模块,它体内含有可执行机器码静态库文件就像一个仓库或者容器,里面封装了一些可执行机器码.这些机器码是我们用程序设计语言,比如C/C++源文件编译后生成的机器码.一.下面将讨论将C/C++源文件编译并链接成一个静态库文件的过程,在VC++6.0中选择File-New-Win32 Static Library,写好工程名创建好工作空间后再选择菜单中New-File来为工程添加C或者C++ 源文件.假如我们为该工程添加了一个名为lib_c.c和一个名为lib_cpp.cpp的源文件//lib_c.c中的内容extern int Add(int x,int y) //该函数是一个外部函数,任何文件都可以访问它{return x+y;}extern int data_c//这是一个外部全局变量,任何文件可以访问它//lib_cpp.cpp中的内容extern “C” intreduce(int x,int y)//这里加了个”C”表示允许C源文件访问这个C++函数代码{return x-y;}extern “C” int data_cpp=2;注意以下几点(1)当“extern”关键字修饰在函数或全局变量的定义中时,表示该函数或全局变量任何文件可以访问,“extern”关键字可以省略不写,缺省下就是”extern”当“extern”关键字修饰在函数声明或全局变量声明中时,表示限定当前文件只能引用用“extern”关键字修饰定义的函数或全局变量.(2)当”static”关键字修饰在函数或全局变量的定义中时,表示该函数或全局变量只能由本文件中加了”static”关键字修饰的函数声明或全局变量声明来引用.当”static”关键字修饰在函数声明或全局变量声明中时,表示限定当前文件只能引用用“static”关键字修饰定义的函数或全局变量.(3)在CPP源文件的函数和全局变量定义中加了个”C”表示允许C源文件访问该函数和全局变量.如果是C++源文件访它们的话则可加可不加.注意这”C”要大写.接下来就要将写好的C/C++源文件进行编译和链接,最后会生成一个扩展名为.lib的文件.该文件就是静态库文件了,该静态库文件是不能直接运行的,我们所编译的C/C++源文件的机器码就已经被封装进这个用VC++6.0创建的静态库文件里面去了.二.如何将编写好的静态库文件像使用C/C++标准库那样使用,下面将继续讨论1.用VC++6.0新建一个工程名为TEST,添加一个名为TEST.c的源文件到该工程,因为我们将测试一下,将我们编写的库文件里的函数或者全局变量的机器码链接到我们这个TEST.c源文件中去,假设我们生成的库文件名为TEST.lib,先拷贝如下范例代码到TEST.c中//TEST.c#include <stdio.h>extern intAdd(int x,int y); //当前文件只能访问“extern”关键字修饰定义的Add函数extern intreduce(int x,int y);// //当前文件只能访问“extern”关键字修饰定义的reduce函数#pragma comment(lib,"TEST.lib") //指示链接器到字符串所表示的文件路径中去找库文件int main(){printf("%d\n",Add(2,3));printf("%d\n",reduce(3,2));return 0;}这里我们要声明静态库中已知的函数或全局变量的声明#pragma comment(lib,"TEST.lib")这条指令告诉链接器到字符串所表示的路径下去找库文件,这里我将库文件放到了当前工程目录下.也可以不写这句.还有一种方法,可以直接在VC++6.0中设置依次选择tools、options、directories、library files菜单或选项,填入库文件路径(只键入库文件所在目录路径而不能输入库文件名),这只是告诉链接器库文件所在目录的路径,还没告诉链接器库文件名,方法是VC++6.0中设置依次选择project-settings-link 在object/library modules: 这栏输入库文件名字然后就OK了2.当用C++源文件的目标文件和库文件的代码链接时有一点小改变,这里就不浪费口舌了,假设我们新建了一个工程并添加了一个名为TEST.CPP的源文件,拷贝如下范例代码到TEST.CPP中//TEST.cpp#include <stdio.h>extern “C” intAdd(int x,int y); //表示引用的是C函数代码extern intreduce(int x,int y);#pragma comment(lib,"TEST.lib")int main(){printf("%d\n",Add(2,3));printf("%d\n",reduce(3,2));return 0;}在这个C++源文件里引用C函数代码同样要加个”C”,但是在C源文件引用C++函数代码不能加”C++”,编译会报错,只能在C++文件函数定义中加”C”.只有C++才支持这种引用方式,也许因为只有C++兼容C而没有C兼容C++这一原则.。