目前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称“静态库”)
,另一种为动态连接库(DLL,以下简称“动态库”)
的导入库(Import Libary,以下简称“导入库”)
。
静态库是一个或者多个obj文件的打包,所以有人干脆把从obj文件生成lib的过程称为Archive,即合并到一起。比如你链接一个静态库,如果其中有错,它会准确的找到是哪个obj有错,即静态lib只是壳子。
动态库一般会有对应的导入库,方便程序静态载入动态链接库,否则你可能就需要自己LoadLibary调入DLL文件,然后再手工GetProcAddress获得对应函数了。有了导入库,你只需要链接导入库后按照头文件函数接口的声明调用函数就可以了。
导入库和静态库
的区别很大,他们实质是不一样的东西。静态库本身就包含了实际执行代码、符号表等等
,而对于导入库而言,其实际的执行代码位于动态库中,导入库只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息
。
这也是实际上很多开源代码发布的惯用方式:
1.
预编译的开发包:包含一些.dll文件和一些.lib文件。其中这里的.lib就是导入库,而不要错以为是静态库。但是引入方式和静态库一样,要在链接路
径上添加找到这些.lib的路径。而.dll则最好放到最后产生的应用程序exe执行文件相同的目录。这样运行时,就会自动调入动态链接库。
2. 用户自己编译: 下载的是源代码,按照readme自己编译。生成很可能也是.dll + .lib(导入库)的库文件
3. 如果你只有dll,并且你知道dll中函数的函数原型,那么你可以直接在自己程序中使用LoadLibary调入DLL文件,GetProcAddress
DLL:
动 态链接库 (DLL)
是作为共享函数库的可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 中,该 DLL
包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据和资源。多个应用程序可同时访问内存中单个 DLL
副本的内容。
动态链接与静态链接的不同之处在于它允许可执行模块(.dll 文件或 .exe 文件)仅包含在运行时定位 DLL 函数的可执行代码所需的信息。在静态链接中,链接器从静态链接库获取所有被引用的函数,并将库同代码一起放到可执行文件中。
使用动态链接代替静态链接有若干优点。DLL 节省内存,减少交换操作,节省磁盘空间,更易于升级,提供售后支持,提供扩展 MFC 库类的机制,支持多语言程序,并使国际版本的创建轻松完成。
API 就是应用程序编程接口。它是能用来操作组件、应用程序或者操作系统的一组函数。典型的情况下,API 由一个或多个提供某种特殊功能的 DLL 组成。
DLL
是一个文件,其中包含了在 Microsoft? Windows? 下运行的任何应用程序都可调用的函数。运行时,DLL
中的函数动态地链接到调用它的应用程序中。无论有多少应用程序调用 DLL
中的某个函数,在磁盘上只有一个文件包含该函数,且只在它调入内存时才创建该 DLL。
您听到最多的 API 可能是 Windows
API,它包括构成 Windows 操作系统的各种 DLL。每个 Windows 应用程序都直接或间接地与 Windows API
互动。Windows API 保证 Windows 下运行的所有应用程序的行为方式一致。
注意 随着 Windows
操作系统的发展,现已发布了几个版本的 Windows API。Windows 3.1 使用 Win16 API。Microsoft?
Windows NT?、Windows 95 和 Windows 98 平台使用 Microsoft? Win32? API。
除 Windows API 外,其他一些 API 也已发布。例如,邮件应用程序编程接口 (MAPI) 是一组可用于编写电子邮件应用程序的 DLL。
API
传统上是为开发 Windows 应用程序的 C 和 C++ 程序员编写的,但其他的编程语言(包括VBA)也可以调用 DLL
中的函数。因为大部分 DLL 主要是为 C 和 C++ 程序员编写和整理说明的,所以调用 DLL 函数的方法与调用 VBA
函数会有所不同。在使用 API 时必须了解如何给 DLL 函数传递参数。
警告 调用 Windows API 和 其他 DLL
函数可能会给您的应用程序带来不良影响。从自己的代码中直接调用 DLL 函数时,您绕过了 VBA 通常提供的一些安全机制。如果在定义或调用
DLL 函数时出现错误(所有程序员都不可避免),可能会在应用程序中引起应用程序错误(也称为通用性保护错误,或
GPF)。最好的解决办法是在运行代码以前保存该项目,并确保了解 DLL 函数调用的原理。
LIB 创建标准库、导入库和导出文件,在生成 32 位程序时可将它们与 LINK 一起使用。LIB 从命令提示运行。
可在下列几种模式下使用 LIB:
生成或修改 COFF 库
将成员对象提取到文件中
创建导出文件和导入库
这些模式是互斥的;每次只能以一种模式使用 LIB。
来源:http://blog.csdn.net/uniqueren/archive/2009/05/09/4163662.aspx
动态链接库、静态库、import库区别
动态链接库(Dynamic Linked Library):
Windows为应用程序提供了丰富的函数调用,这些函数调用都包含在动态链接库中。其中有3个最重要的DLL,Kernel32.dll,它包含用于管理内存、进程和线程的各个函数;
User32.dll,它包含用于执行用户界面任务(如窗口的创建和消息的传送)的各个函数;GDI32.dll,它包含用于画图和显示文本的各个函数。
静态库(Static Library):
函数和数据被编译进一个二进制文件(通常扩展名为.LIB)。在使用静态库的情况下,在编译链接可执行文件时,链接器从库中复制这些函数和数据并把它们和应用程序的其它模块
组合起来创建最终的可执行文件(.EXE文件)。
导入库(Import Library):
在使用动态链接库的时候,往往提供两个文件:一个引入库和一个DLL。引入库包含被DLL导出的函数和变量的符号名,DLL包含实际的函数和数据。在编译链接可执行文件时,只需
要链接引入库,DLL中的函数代码和数据并不复制到可执行文件中,在运行的时候,再去加载DLL,访问DLL中导出的函数。
在运行Windows程序时,它通过一个被称作“动态链接”的进程与Windows相接。一个Windows的.EXE文件拥有它使用不同动态链接库的引用,所使用的函数即在那里。当Windows程
序被加载到内存中时,程序中的调用被指向DLL函数的入口,如果DLL不在内存中,系统就将其加载到内存中。
当链接Windows程序以产生一个可执行文件时,你必须链接由编程环境提供的专门的“导入库(import library)库”。这些导入库包含了动态链接库名称和所有Windows函数调用的
引用信息。链接程序使用该信息在.EXE文件中构造一个表,当加载程序时,Windows使用它将调用转换为Windows函数。
静态库与导入库的区别:
导入库和静态库的区别很大,他们实质是不一样的东西。静态库本身就包含了实际执行代码、符号表等等,而对于导入库而言,其实际的执行代码位于动态库中,导入库只包含了
地址符号表等,确保程序找到对应函数的一些基本地址信息。
静态链接与动态链接:
静态链接方法:#pragma comment(lib, "test.lib") ,静态链接的时候,载入代码就会把程序会用到的动态代码或动态代码的地址确定下来
静态库的链接可以使用静态链接,动态链接库也可以使用这种方法链接导入库
动态链接方法:LoadLibrary()/GetProcessAddress()和FreeLibrary(),使用这种方式的程序并不在一开
始就完成动态链接,而是直到真正调用动态库代码时,载入程序才计算(被调用的那部分)动态代码的逻辑地址,然后等到某个时候,程序又需要调用另外某块动态
代码时,载入程序又去计算这部分代码的逻辑地址,所以,这种方式使程序初始化时间较短,但运行期间的性能比不上静态链接的程序。
分享到:
相关推荐
动态链接库(DLL)和静态链接库(LIB)是Windows操作系统中两种常见的库文件类型,它们在软件开发中起着至关重要的作用。本篇文章将深入探讨这两种库的区别、生成过程以及如何在实际项目中使用。 首先,我们来看...
生成的文件通常包括`.dll`和`.lib`文件,`.dll`是实际的动态链接库,`.lib`是导入库,用于编译使用DLL的客户端程序。 5. **创建客户端应用程序** - 创建一个新的Win32控制台应用程序,作为DLL的客户端。 - 将DLL...
标题中的“自-静态链接库(Lib)与动态链接库(DLL)的区别”是指在软件开发过程中,如何选择使用静态链接库(.lib)和动态链接库(.dll)这两种不同的库类型。它们各自有不同的特性和使用场景。 静态链接库是将库文件中的...
DLL文件包含了可执行代码和数据,而LIB文件则是DLL的导入库,用于静态链接。 在静态链接时,编译器会将LIB文件中的函数引用信息合并到EXE文件中,这样EXE文件就知道如何在运行时找到DLL中的函数。当DLL文件改动并...
DLL文件有导出库(包含函数在DLL中的位置信息)和导入库(提供函数声明)两种形式。在命令行编译时,需要显式指定使用哪些DLL,而在IDE环境中,编译器通常会自动管理这些依赖关系。 使用DLL的一个例子是,在同一个...
1. **编译期链接**:在编译阶段,程序员在源代码中使用`#pragma comment(lib, "dllname.lib")`来指示编译器链接对应的导入库(.lib文件),这个导入库包含了DLL的导出函数声明和导入记录。 2. **运行时加载**:当...
`dll`是实际的运行时库,而`lib`是导入库,供其他程序链接使用。 4. **创建调用DLL的项目(test_mydll)**: - 新建一个C++ Win32控制台应用程序,命名为`test_mydll`。 - 引入DLL:在`test_mydll`项目中,包含`...
动态链接库(DLL)与静态链接库是Windows操作系统中两种主要的库文件类型,它们在程序开发和执行中起着至关重要的作用。本作业将深入探讨这两种库的区别、使用方式以及如何实现动态链接库调用静态库。 首先,静态...
2. 使用`cl.exe`(Windows)或`g++`(Unix/Linux)等编译器,生成`.dll`或`.so`动态库文件及对应的导入库(`.lib`或`.a`)。 3. 在目标项目中,通过设置链接器选项来指定动态库,并在运行时确保库文件可用。 在C++...
动态链接库(DLL,Dynamic Link Library)是Windows操作系统中一种重要的共享代码库机制。它允许多个应用程序同时使用相同的代码,从而节省内存并简化软件维护。C++编程语言中,开发者可以创建自己的DLL来实现功能...
.lib文件是导入库,它包含了其他程序链接到DLL所需的信息。 6. **使用DLL**:在需要使用DLL的程序中,通过`LoadLibrary`和`GetProcAddress`函数动态加载DLL,并获取函数指针来调用DLL中的函数。或者,如果在编译时...
1. 隐式链接:隐式链接是通过在编译时指定DLL的导入库来完成的。在项目的链接器设置中,添加DLL的.lib文件,编译器会在运行时自动查找对应的.dll文件。 2. 显示调用:显示调用是在运行时通过LoadLibrary和...
这需要在项目设置中指定所需的.lib导入库,并在链接时将.dll文件放在系统路径或应用程序目录下。这样,程序启动时会自动加载DLL,无需额外的加载操作。 - **显式链接**:程序运行时才加载DLL,需要使用LoadLibrary...
编译完成后,你会得到一个.dll文件和对应的.lib文件,后者是导入库,用于告诉链接器如何找到DLL中的函数。 使用DLL时,需要在调用它的程序中包含对应的头文件(如果有的话),然后使用`__declspec(dllimport)`...
- 在主程序中,使用`#pragma comment(lib, "dll名.lib")`指令来链接DLL的导入库,以解决链接时的依赖问题。 - `LoadLibrary`函数用于在运行时加载DLL,`FreeLibrary`则用于释放DLL资源。 - `GetProcAddress`函数...
`.lib`文件是导入库,用于告诉编译器如何链接到DLL。 调用DLL的部分,你需要创建一个新项目,如"QT dll test",并将计算器DLL添加到项目的依赖项中。在QT工程的.pro文件中,添加如下行来链接到DLL: ```makefile ...
它们分为静态链接库(Static Library)和动态链接库(Dynamic Link Library,简称DLL)。本压缩包中的资源,如"LIBTEST"、"dllTest"、"dllCall"、"libCall"等,都是围绕这两种链接库类型进行的实例,旨在帮助开发者...