问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

lib和dll有什么区别,什么叫静态链接库,什么叫动态连接库

发布网友 发布时间:2022-04-24 00:44

我来回答

2个回答

热心网友 时间:2023-10-16 05:01

  静态链接库与动态链接库区别
  静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了。但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE 独立的 DLL 文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。动态库就是在需要调用其中的函数时,根据函数映射表找到该函数然后调入堆栈执行。如果在当前工程中有多处对dll文件中同一个函数的调用,那么执行时,这个函数只会留下一份拷贝。但是如果有多处对lib文件中同一个函数的调用,那么执行时,该函数将在当前程序的执行空间里留下多份拷贝,而且是一处调用就产生一份拷贝。
  静态链接库与静态链接库调用规则总体比较如下:
  1、 静态链接库(比较简单):
  首先,静态链接库的使用需要库的开发者提供生成库的.h头文件和.lib文件。生成库的.h头文件中的声明格式如下:
  extern "C" 函数返回类型 函数名(参数表);
  在调用程序的.cpp源代码文件中如下:
  #include "../lib.h"
  #pragma comment(lib,"..//debug//libTest.lib") //指定与静态库一起链接
  其次因为静态链接库是将全部指令都包含入调用程序生成的EXE文件中。因此如果用的是静态链接库,那么也就不存在“导出某个函数提供给用户使用”的情况,要想用就得全要!要不就都别要!
  2、 态链接库:
  动态链接库的使用需要库的开发者提供生成的.lib文件和.dll文件。或者只提供dll文件。
  首先我们必须先注意到DLL内的函数分为两种:
  1) 出函数,可供应用程序调用;
  2) LL内部函数,只能在 DLL 程序使用,应用程序无法调用它们。
  因此调用程序若想调用DLL中的某个函数就要以某种形式或方式指明它到底想调用哪一个函数。
  Ø 对于DLL的导出,可以采用如下方法:
  #ifdef WLL_EXPORTS
  #define WLL_API __declspec(dllexport)
  #else
  #define WLL_API __declspec(dllimport)
  #endif
  这是导出类的宏定义,将导出类必须加上该宏,才能被导出。
  此处的WLL_EXPORTS会出现在 projectàsettingsàC++à PreProcessor的PreProcessor definition中,这个MACRO表明其要定义一个导出宏。
  当前库编译时,加了WLL_API的类将被导出,而包含该头文件的其他调用DLL或EXE,由于没有定义WLL_API宏,将申明为导入该类。
  Ø 动态库函数的调用,可以采用静态链接的方式,主要步骤如下:
  包含DLL中导出的头文件。
  采用#pragma comment(lib,"..//debug//libTest.lib")导入动态库生成的*.lib头文件。或在projectàsettingsàLinkeràInput的Additional Dependencies中加入lib文件。
  将动态库生成的*.dll文件放到EXE或DLL的同一目录下。
  Ø 也可以采用动态加载的方式调用,步骤如下:
  Another.dll有一个int Add(int x,int y) 函数。则完整的调用过程如下:
  typedef int (* FunPtr)(int,int); //定义函数指针
  FunPtr funPtr;
  Handle handle =LoadLibrary("Another.dll");
  funPtr =(FunPtr)GetProcAddress(handle ,"Add");
  funPtr(2,3); // 2+3;
  FreeLibrary(handle); // 释放载入的动态库
  LIB文件
  目前以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 函数调用的原理。

热心网友 时间:2023-10-16 05:01

LIB文件是一个导入库。客户程序要使用DLL,只有导出声明还不够,这样
并不能使客户联接到DLL。客户的工程必须对链接程序指定LIB文件。这种
方式叫隐式链接。我们还可以用显式链接:调用LoadLibray函数,指定dll
路径。

热心网友 时间:2023-10-16 05:01

  静态链接库与动态链接库区别
  静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了。但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE 独立的 DLL 文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。动态库就是在需要调用其中的函数时,根据函数映射表找到该函数然后调入堆栈执行。如果在当前工程中有多处对dll文件中同一个函数的调用,那么执行时,这个函数只会留下一份拷贝。但是如果有多处对lib文件中同一个函数的调用,那么执行时,该函数将在当前程序的执行空间里留下多份拷贝,而且是一处调用就产生一份拷贝。
  静态链接库与静态链接库调用规则总体比较如下:
  1、 静态链接库(比较简单):
  首先,静态链接库的使用需要库的开发者提供生成库的.h头文件和.lib文件。生成库的.h头文件中的声明格式如下:
  extern "C" 函数返回类型 函数名(参数表);
  在调用程序的.cpp源代码文件中如下:
  #include "../lib.h"
  #pragma comment(lib,"..//debug//libTest.lib") //指定与静态库一起链接
  其次因为静态链接库是将全部指令都包含入调用程序生成的EXE文件中。因此如果用的是静态链接库,那么也就不存在“导出某个函数提供给用户使用”的情况,要想用就得全要!要不就都别要!
  2、 态链接库:
  动态链接库的使用需要库的开发者提供生成的.lib文件和.dll文件。或者只提供dll文件。
  首先我们必须先注意到DLL内的函数分为两种:
  1) 出函数,可供应用程序调用;
  2) LL内部函数,只能在 DLL 程序使用,应用程序无法调用它们。
  因此调用程序若想调用DLL中的某个函数就要以某种形式或方式指明它到底想调用哪一个函数。
  Ø 对于DLL的导出,可以采用如下方法:
  #ifdef WLL_EXPORTS
  #define WLL_API __declspec(dllexport)
  #else
  #define WLL_API __declspec(dllimport)
  #endif
  这是导出类的宏定义,将导出类必须加上该宏,才能被导出。
  此处的WLL_EXPORTS会出现在 projectàsettingsàC++à PreProcessor的PreProcessor definition中,这个MACRO表明其要定义一个导出宏。
  当前库编译时,加了WLL_API的类将被导出,而包含该头文件的其他调用DLL或EXE,由于没有定义WLL_API宏,将申明为导入该类。
  Ø 动态库函数的调用,可以采用静态链接的方式,主要步骤如下:
  包含DLL中导出的头文件。
  采用#pragma comment(lib,"..//debug//libTest.lib")导入动态库生成的*.lib头文件。或在projectàsettingsàLinkeràInput的Additional Dependencies中加入lib文件。
  将动态库生成的*.dll文件放到EXE或DLL的同一目录下。
  Ø 也可以采用动态加载的方式调用,步骤如下:
  Another.dll有一个int Add(int x,int y) 函数。则完整的调用过程如下:
  typedef int (* FunPtr)(int,int); //定义函数指针
  FunPtr funPtr;
  Handle handle =LoadLibrary("Another.dll");
  funPtr =(FunPtr)GetProcAddress(handle ,"Add");
  funPtr(2,3); // 2+3;
  FreeLibrary(handle); // 释放载入的动态库
  LIB文件
  目前以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 函数调用的原理。

热心网友 时间:2023-10-16 05:01

LIB文件是一个导入库。客户程序要使用DLL,只有导出声明还不够,这样
并不能使客户联接到DLL。客户的工程必须对链接程序指定LIB文件。这种
方式叫隐式链接。我们还可以用显式链接:调用LoadLibray函数,指定dll
路径。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
Linux系统安装FTP服务器 Linux系统的网络文件共享 建筑的七盏明灯的内容简介 面向对象设计七大原则 简单说 交互设计七大定律 交互设计的“根”——七大定律 交互设计原则和理论2——七大定律 七大设计原则 附近的加油站有哪些 附近的加油站有哪些地方 LIB文件和DLL文件有什么不同? windows中LIB和DLL的区别与使用 求:我刚刚删除的文件不在回收站,怎么能恢复啊?急用,谢谢! 删除的文件由于太大不在回收站,该怎么恢复? 用什么方式删除文件不能在回收站里恢复 删除的文件不在回收站,该怎么恢复 用delete删掉桌面文件后,为什么回收站里没有,怎样才能恢复?_百度... 删除文件怎么找回,不在回收站里 删除的东西不在回收站,我怎么才能找回来? 周秀娜和罗仲谦演戏 周秀娜和罗仲谦房事完后到客厅又干啥 婚前试爱周秀娜和罗仲谦真的做了吗 周秀娜罗仲谦演过的电影有哪些 《婚前试爱》周秀娜在罗仲谦手机偷偷安装的“追瘦你追瘦我”软件google Latitude 在哪可以下载啊 周秀娜那部电影最好看 汽车上电源分为30电和15电,这两个电的命名来源是什么? 罗仲谦 手机号码罗仲谦微博罗仲谦电影罗仲谦女友罗仲谦 傅颖周秀娜罗仲谦罗仲谦及沈志明罗仲谦身高罗仲谦 静电是什么电 正电,还是负电 周秀娜罗仲谦演的所有影片?? 放结婚前一天的电影叫什么名字 .lib文件与.dll文件的区别 VC中dll的lib文件和dll有什么不同? 同名的lib库和dll动态库有什么区别 .dll .h .lib等文件的作用与区别 请教VC中.DLL文件与.LIB文件的区别 静态链接库LIB和动态链接库DLL的区别 什么是lib文件,lib和dll的关系如何 dll的两种调用方式,lib与dll区别 现在买ST华光600076怎么样,哪位专业人士评一下 DLL 文件是WINDOWS特有的么,和CPP文件,LIB文件有什么区别 C++ 调用lib 和 dll的 方法 及 动态库DLL与静态库lib的区别 DLL和LIB文件都是干什么用的?怎么用在VC++里面? windows环境下lib和dll的区别和联系详细 委差为正值,为什么委比是负值呢? 如何查看lib文件与dll文件的对应关系 委比负57.36%,啥意思 lib文件静态库和dll文件动态连接库有什么不同,分别有什么作用!在编译时... 炒股中的市盈率、市净率是什么意思?委比为负值该怎么理解?谢谢了, c++中h文件和lib有什么区别? 恐怖漫画朋友的妻子的结局是什么