目前以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。
分享到:
相关推荐
动态链接库(DLL)和静态链接库(LIB)是Windows操作系统中两种常见的库文件类型,它们在软件开发中起着至关重要的作用。本篇文章将深入探讨这两种库的区别、生成过程以及如何在实际项目中使用。 首先,我们来看...
标题中的“自-静态链接库(Lib)与动态链接库(DLL)的区别”是指在软件开发过程中,如何选择使用静态链接库(.lib)和动态链接库(.dll)这两种不同的库类型。它们各自有不同的特性和使用场景。 静态链接库是将库文件中的...
DLL文件有导出库(包含函数在DLL中的位置信息)和导入库(提供函数声明)两种形式。在命令行编译时,需要显式指定使用哪些DLL,而在IDE环境中,编译器通常会自动管理这些依赖关系。 使用DLL的一个例子是,在同一个...
生成的文件通常包括`.dll`和`.lib`文件,`.dll`是实际的动态链接库,`.lib`是导入库,用于编译使用DLL的客户端程序。 5. **创建客户端应用程序** - 创建一个新的Win32控制台应用程序,作为DLL的客户端。 - 将DLL...
DLL文件包含了可执行代码和数据,而LIB文件则是DLL的导入库,用于静态链接。 在静态链接时,编译器会将LIB文件中的函数引用信息合并到EXE文件中,这样EXE文件就知道如何在运行时找到DLL中的函数。当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操作系统中两种主要的库文件类型,它们在程序开发和执行中起着至关重要的作用。本作业将深入探讨这两种库的区别、使用方式以及如何实现动态链接库调用静态库。 首先,静态...
动态链接库(DLL,Dynamic Link Library)是Windows操作系统中一种重要的共享代码库机制。它允许多个应用程序同时使用相同的代码,从而节省内存并简化软件维护。C++编程语言中,开发者可以创建自己的DLL来实现功能...
2. 使用`cl.exe`(Windows)或`g++`(Unix/Linux)等编译器,生成`.dll`或`.so`动态库文件及对应的导入库(`.lib`或`.a`)。 3. 在目标项目中,通过设置链接器选项来指定动态库,并在运行时确保库文件可用。 在C++...
.lib文件是导入库,它包含了其他程序链接到DLL所需的信息。 6. **使用DLL**:在需要使用DLL的程序中,通过`LoadLibrary`和`GetProcAddress`函数动态加载DLL,并获取函数指针来调用DLL中的函数。或者,如果在编译时...
编译完成后,你会得到一个.dll文件和对应的.lib文件,后者是导入库,用于告诉链接器如何找到DLL中的函数。 使用DLL时,需要在调用它的程序中包含对应的头文件(如果有的话),然后使用`__declspec(dllimport)`...
1. 隐式链接:隐式链接是通过在编译时指定DLL的导入库来完成的。在项目的链接器设置中,添加DLL的.lib文件,编译器会在运行时自动查找对应的.dll文件。 2. 显示调用:显示调用是在运行时通过LoadLibrary和...
这需要在项目设置中指定所需的.lib导入库,并在链接时将.dll文件放在系统路径或应用程序目录下。这样,程序启动时会自动加载DLL,无需额外的加载操作。 - **显式链接**:程序运行时才加载DLL,需要使用LoadLibrary...
`.lib`文件是导入库,用于告诉编译器如何链接到DLL。 调用DLL的部分,你需要创建一个新项目,如"QT dll test",并将计算器DLL添加到项目的依赖项中。在QT工程的.pro文件中,添加如下行来链接到DLL: ```makefile ...
- 在主程序中,使用`#pragma comment(lib, "dll名.lib")`指令来链接DLL的导入库,以解决链接时的依赖问题。 - `LoadLibrary`函数用于在运行时加载DLL,`FreeLibrary`则用于释放DLL资源。 - `GetProcAddress`函数...
1. 导入库(.lib):为方便编译时链接,DLL可以提供一个导入库,其中包含了对DLL导出函数的引用信息。 2. 导出库:DLL本身是导出库,包含实际的函数实现和数据。 五、延迟加载DLL 通过设置编译选项,可以实现程序...