windows环境下lib和dll的区别和联系详细

DLL概念及使用详解 因为后来接触DLL这块比较多,但是头脑里始终没有比较清晰的概念和框架所以比较混乱,所以每次弄的时候都要花费时间再捋顺概念,于是有了这篇文章: 1.梳理下各种概念,建立关于这个知识点的框架 2.mark方便回看和避免以后浪费时间做重复性工作 3.还有很多不懂地方,希望抛砖引玉有大佬来解答我的问题 静态链接库,动态连接库概念及优缺点 静态连接库 静态连接库:Window下以*.lib Linux下以*.a 命名的文件统称; 静态连接库就是把(lib)文件中用到的函数代码直接链接进目标程序,程序发布运行的时. 阅读详情

c++中共有两种库:
1、LIB包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamic link library。
(这种方式更灵活,写的程序体积小,但是需要.exe和dll同时发布)
2、LIB包含函数代码本身,在编译时直接将代码加入程序当中,称为静态链接库static link library。(这种方式不是很灵活,因为lib被编译到.exe中,写出的程序体积大,但是只需要发布exe即可,不需要dll文件)
共有两种链接方式:
1、动态链接使用动态链接库,允许可执行模块(.dll文件或.exe文件)仅包含在运行时定位DLL函数的可执行代码所需的信息。
2、静态链接使用静态链接库,链接器从静态链接库LIB获取所有被引用函数,并将库同代码一起放到可执行文件中。

关于lib和dll的区别如下:
(1)lib是编译时用到的,dll是运行时用到的。如果要完成源代码的编译,只需要lib;如果要使动态链接的程序运行起来,只需要dll。
(2)如果有dll文件,那么lib一般是一些索引信息,记录了dll中函数的入口和位置,dll中是函数的具体内容;如果只有lib文件,那么这个lib文件是静态编译出来的,索引和实现都在其中。使用静态编译的lib文件,在运行程序时不需要再挂动态库,缺点是导致应用程序比较大,而且失去了动态库的灵活性,发布新版本时要发布新的应用程序才行。
(3)动态链接的情况下,有两个文件:一个是LIB文件,一个是DLL文件。LIB包含被DLL导出的函数名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到DLL文件。在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中相应函数代码的地址,从而节省了内存资源。DLL和LIB文件必须随应用程序一起发行,否则应用程序会产生错误。如果不想用lib文件或者没有lib文件,可以用WIN32 API函数LoadLibrary、GetProcAddress装载。

(静态连接)使用lib需注意两个文件:
(1).h头文件,包含lib中说明输出的类或符号原型或数据结构。应用程序调用lib时,需要将该文件包含入应用程序的源文件中。
(2).LIB文件,略。

(动态连接)使用dll需注意三个文件:
(1).h头文件,包含dll中说明输出的类或符号原型或数据结构的.h文件。应用程序调用dll时,需要将该文件包含入应用程序的源文件中。
(2).LIB文件,是dll在编译、链接成功之后生成的文件,作用是当其他应用程序调用dll时,需要将该文件引入应用程序,否则产生错误。如果不想用lib文件或者没有lib文件,可以用WIN32API函数LoadLibrary、GetProcAddress装载。
(3).dll文件,真正的可执行文件,开发成功后的应用程序在发布时,只需要有.exe文件和.dll文件,并不需要.lib文件和.h头文件。

使用lib的方法:
静态lib中,一个lib文件实际上是任意个obj文件的集合,obj文件是cpp文件编译生成的。在编译这种静态库工程时,根本不会遇到链接错误;即使有错,也只会在使用这个lib的EXT文件或者DLL工程里暴露出来。
在VC中新建一个static library类型的工程Lib,加入test.cpp文件和test.h文件(头文件内包括函数声明),然后编译,就生成了Lib.lib文件。
别的工程要使用这个lib有两种方式:
(1)在project->link->Object/Library Module中加入Lib.lib文件(先查询工程目录,再查询系统Lib目录);或者在源代码中加入指令#pragma comment(lib, “Lib.lib”)。
(2)将Lib.lib拷入工程所在目录,或者执行文件生成的目录,或者系统Lib目录中。
(3)加入相应的头文件test.h。

使用DLL的方法:
使用动态链接中的lib,不是obj文件的集合,即里面不会有实际的实现,它只是提供动态链接到DLL所需要的信息,这种lib可以在编译一个DLL工程时由编译器生成。
创建DLL工程的方法(略)。
(1)隐式链接

 

第一种方法是:通过project->link->Object/Library Module中加入.lib文件(或者在源代码中加入指令#pragma comment(lib, “Lib.lib”)),并将.dll文件置入工程所在目录,然后添加对应的.h头文件。

 

 

#include "stdafx.h"
#include "DLLSample.h"

#pragma comment(lib, "DLLSample.lib")    //你也可以在项目属性中设置库的链接

int main()
{
        TestDLL(123);   //dll中的函数,在DllSample.h中声明
        return(1);
}

(2)显式链接
需要函数指针和WIN32 API函数LoadLibrary、GetProcAddress装载,使用这种载入方法,不需要.lib文件和.h头文件,只需要.dll文件即可(将.dll文件置入工程目录中)。

 

#include <iostream>
#include <windows.h>         //使用函数和某些特殊变量
typedef void (*DLLFunc)(int);
int main()
{
        DLLFunc dllFunc;
        HINSTANCE hInstLibrary = LoadLibrary("DLLSample.dll");

        if (hInstLibrary == NULL)
        {
          FreeLibrary(hInstLibrary);
        }
        dllFunc = (DLLFunc)GetProcAddress(hInstLibrary, "TestDLL");
        if (dllFunc == NULL)
        {
          FreeLibrary(hInstLibrary);
        }
        dllFunc(123);
        std::cin.get();
        FreeLibrary(hInstLibrary);
        return(1);
}


LoadLibrary函数利用一个名称作为参数,获得DLL的实例(HINSTANCE类型是实例的句柄),通常调用该函数后需要查看一下函数返回是否成功,如果不成功则返回NULL(句柄无效),此时调用函数FreeLibrary释放DLL获得的内存。
GetProcAddress函数利用DLL的句柄和函数的名称作为参数,返回相应的函数指针,同时必须使用强转;判断函数指针是否为NULL,如果是则调用函数FreeLibrary释放DLL获得的内存。此后,可以使用函数指针来调用实际的函数。
最后要记得使用FreeLibrary函数释放内存。

注意:应用程序如何找到DLL文件?
使用LoadLibrary显式链接,那么在函数的参数中可以指定DLL文件的完整路径;如果不指定路径,或者进行隐式链接,Windows将遵循下面的搜索顺序来定位DLL:
(1)包含EXE文件的目录
(2)工程目录
(3)Windows系统目录
(4)Windows目录
(5)列在Path环境变量中的一系列目录


 

 

 

基于Windows的Fortran90 生成Dll动态链接库给python调用(防踩坑,超细节) 函数的可执行代码位于一个DLL中,该DLL中包含一个或者多个已经被编译,链接并使用它们的进程分开存储的函数,在vs中新建生成动态库的工程,编译成功后,产生一个.lib和一个.dll文件。在vs中新建生成静态库的工程,编译生成成功后,只产生一个.lib文件。动态库的lib:该lib包含了函数所在的DLL文件和文件中函数位置的信息,函数实现代码由运行的时候加载在进程空间中DLL提供,总之,lib是编译的时候用到的,如果完成源代码的编译,只需要lib,如果要使得动态库的程序运行起来,只需要dll。 阅读详情

相关推荐

动态链接库——DLL文件

引入库文件包含被DLL导出的函数的名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到所需要使用的DLL文件,库中的函数和数据并不复制到可执行文件中,因此在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中所要调用的函数的内存地址,这样当一个或多个应用程序运行是再把程序代码和被调用的函数代码链接起来,从而节省了内存资源。dll通常包含的是多个程序都能用到的代码和数据,一般大型软件都有一个exe和一堆dll文件。将库中的代码先加载到内存中,再链接到可执行文件中。

qq_43199575的博客 691

lib和dll的区别

1)lib是编译时用到的,dll是运行时用到的。如果要完成源代码的编译,只需要lib;如果要使动态链接的程序运行起来,只需要dll。 (2)如果有dll文件,那么lib一般是一些索引信息,记录了dll中函数的入口和位置,dll中是函数的具体内容;如果只有lib文件,那么这个lib文件是静态编译出来的,索引和实现都在其中。使用静态编译的lib文件,在运行程序时不需要再挂动态库,缺点是导致应用程序比较大,而且失去了动态库的灵活性,发布新版本时要发布新的应用程序才行。 (3)动态链接的情况下,有两个文件:一个是L

hanslaser_2014的专栏 755

诊断DLL——1.Visual Studio安装与dll使用

.dll文件是**Dynamic Link Library**(动态链接库)文件的缩写,它是一种共享库文件,包含了程序所需的代码和数据。与静态链接库不同,动态链接库可以在程序运行时动态加载,使得程序的内存占用更小,同时也方便了程序的更新和维护。

诊断协议那些事儿's blog 2865

LIB 和 DLL 的区别与使用

(2).LIB 文件,是 dll 在编译、链接成功之后生成的文件,作用是当其他应用程序调用 dll 时,需要将该文件引入应用程序,否则产生错误。使用动态链接中的 lib,不是 obj 文件的集合,即里面不会有实际的实现,它只是提供动态链接到 DLL 所需要的信息,这种 lib 可以在编译一个 DLL 工程时由编译器生成。(3).dll 文件,真正的可执行文件,开发成功后的应用程序在发布时,只需要有.exe 文件和.dll 文件,并不需要.lib 文件和.h 头文件。如果要完成源代码的编译,只需要 lib;

ucliaohh的专栏 3441

Java8对接三方流式接口,并实时输出(GPT)

【代码】Java8对接三方流式接口,并实时输出(GPT)

m0_58617940的博客 1726

【JS】自定义上传组件,文件上传与回显,自定义进度条显示(基于element-plus与axios)

公司是做B 端产品的,有sass平台也有源码交付的项目,最近开发了很多小系统,这里记录一下开发遇到的问题。 需要定制一个上传组件,要求可以自定义文件存储路径,自定义可上传的文件类型,限制文件大小等,并且提供基础的文件回显功能,例如上传一张图片到服务器指定目录的`/file`文件夹下面,并且实现可以查看预览的功能。

余浩的博客 1160

C++笔记-对windows平台上lib和dll的进一步理解(2024-10-21

这些组成部分使得 .so 文件能够在运行时被动态加载、链接和执行。Windows 需要提供 LIB 来描述 DLL 的接口,而 Linux 的 SO 文件通过自身的设计,实现了足够的接口描述,因此只需提供一个文件。部署时,仅需要 DLL;开发时,方便起见通常使用 LIB。如果直接用 DLL,也可以使用动态加载的方式,但会增加一些复杂性。

IT1995的博客 969

FR4板材实战:用ADS 2023快速设计微带线低通滤波器(附Line-Cal计算技巧)

本文详细介绍了使用ADS 2023在FR4板材上设计1-3GHz微带线低通滤波器的工程技巧。通过Line-Cal工具快速计算微带线参数,解决FR4板材的介质损耗和阻抗匹配问题,提供从集总参数转换到分布参数的实用方法,并分享版图设计与实测验证的关键要点,帮助工程师高效完成射频滤波器设计。

omega的博客 713

DLL与LIB的区别和联系

什么是lib文件,lib和dll的关系如何 (转,原文地址未知) (1)lib是编译时需要的,dll是运行时需要的。 如果要完成源代码的编译,有lib就够了。 如果也使动态连接的程序运行起来,有dll就够了。 在开发和调试阶段,当然最好都有。 (2)一般的动态库程序有lib文件和dll文件。lib文件是必须在编译期就连接到应用程序中的,而dll文件是运行期才会被调用的。如果有dll文件,那么对应的

yqyy1989的专栏 520

CentOS 9 Stream 上安装 MySQL 8.0+

根据提示进行设置,包括设置新的 root 密码、禁用远程 root 登录等。MySQL 在首次安装时会生成一个临时密码。这样就完成了 MySQL 8.0.37 的安装。这将安装最新的 MySQL 8.0 版本。

小强不是坑 1678

手把手教你用DaVinci Configurator配置AUTOSAR SWC接口(含RTE避坑指南)

本文提供了一份基于DaVinci Configurator工具的AUTOSAR软件组件(SWC)接口配置实战指南。文章详细拆解了SR(发送者-接收者)和CS(客户端-服务器)接口的配置流程,并重点分享了运行时环境(RTE)生成阶段在多核部署、数据类型匹配等常见陷阱中的避坑方案与调试技巧,旨在帮助汽车电子工程师高效完成配置并规避错误。

uuu88的博客 547

DLL和LIB区别和联系.

在Windows下有.LIB和.DLL两种后缀形式的库这两者之间有什么区别和联系呢?lib是库的简称,共有两种一种包含了函数所在DLL文件和文件中函数位置的信息,代码由运行时加载在进程空间中的DLL提供。称为动态链接库dynamic link library另一种包含函数代码本身,在编译时直接将代码加入程序当中。称为静态链接库static link library区别:   lib是编译时

~~程序是门艺术,而我却在艺术之门之外~~ IT草根专栏 1251

2023-12-26~2025-07-04备份

一、海康视觉与汇川机器人 服务器-客户端通信设置IP在同一网段名称IP端口类型海康相机工控机7930服务器机器人3000客户端海康VM服务器设置1通信管理 增添TCP服务端,设置本机IP:192.168.0.20,端口号79302 协议解析 通信双方约定通信格式(设置收发数据格式,分隔符)机器人客户端设置(不同类型机器人设置有差别)1 通讯服务设置 设置连接服务器IP、服务端端口号、机器人端口号,确保连接正常2 协议解析 使用指令代码构建通讯解析。

青铜小码农 3126

lib和dll文件的区别和联系

 什么是lib文件,lib和dll的关系如何(1)lib是编译时需要的,dll是运行时需要的。 如果要完成源代码的编译,有lib就够了。 如果也使动态连接的程序运行起来,有dll就够了。 在开发和调试阶段,当然最好都有。 (2)一般的动态库程序有lib文件和dll文件。lib文件是必须在编译期就连接到应用程序中的,而dll文件是运行期才会被调用的。如果有dll文件,那么对应的lib文件一般是一

wgklovechj的专栏 298

帆软报表开发-快速入门

数据可视化展示功能特点如下:选择权限管理 > 用户最终权限 > 汤姆(Tom) > 选择图表设计入门 > 打开查看权限。

郭宝的博客 5968

YOLO26跨时代升级!YOLO26 MLCA注意力机制解读

摘要: 本文提出了一种基于多级上下文聚合(MLCA)注意力机制的改进卷积神经网络。MLCA模块通过局部和全局注意力机制动态调整特征图权重,结合了ECA注意力与自适应池化,显著提升特征表达能力。实验表明,添加MLCA后模型mAP提升12.11,准确率提高5.43。文中详细解析了MLCA1模块的工作原理,包括局部/全局池化、卷积操作和注意力加权机制,并介绍了集成MLCA的Bottleneck_MLCA模块。该机制通过多层次特征融合,在保持计算效率的同时增强模型对关键特征的敏感性。最后提供了YOLOv26-MLC

m0_71589036的博客 281

[ZZ] lib和dll文件的区别和联系

 原文网址:http://tieba.baidu.com/f?kz=462808373 什么是lib文件,lib和dll的关系如何 (1)lib是编译时需要的,dll是运行时需要的。如果要完成源代码的编译,有lib就够了。 如果也使动态连接的程序运行起来,有dll就够了在开发和调试阶段,当然最好都有。(2)一般的动态库程序有lib文件和dll文件。lib文件是必须在编译期就连接到应用程序中

byrne8378的专栏 427

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

lib文件和dll文件

 什么是lib文件,lib和dll的关系如何 (1)lib是编译时需要的,dll是运行时需要的。如果要完成源代码的编译,有lib就够了。 如果也使动态连接的程序运行起来,有dll就够了在开发和调试阶段,当然最好都有。(2)一般的动态库程序有lib文件和dll文件。lib文件是必须在编译期就连接到应用程序中的,而dll文件是运行期才会被调用的。如果有 dll文件,那么对应的lib文件一般是一些索

lchunli的专栏 678

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Visual Stdio的中的dll和lib

自己的一点点小笔记,留给将来需要的时候看看。 运行环境:windows7和VS2010 对于dll和lib两者的关系,需要理解的一个概念是编译时和运行时。 lib是编译时的东西,在lib里面包含了方法名和方法所在的dll名字,可以用dumpbin -all XXX.lib查看内容。 dll是运行时的东西,里面是方法的实体。可以通过depends查看里面的方法和引

DoDoMouse的专栏 3668

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

关于QT加载lib与dll的一点评论

On Windows, you always link against a .lib file, even if the library itself is in a DLL. What you normally have to do to use an external library, on any platform, is: 1) Add the library to the LIBS

菜鸟天路 1004

lib 库 dll 库总结

https://baike.baidu.com/item/lib/2395664?fr=aladdin LIB有两种 一种是静态库,比如C-Runtime库,这种LIB中有函数的实现代码,一般用在静态连编上,它是将LIB中的代码加入目标模块(EXE或者DLL)文件中,所以链接好了之后,LIB文件就没有用了。 一种LIB是和DLL配合使用的,里面没有代码,代码在DLL中,这种LIB是用在静态调用DLL上的, 所以起的作用也是链接作用,链接完成了,LIB也没用了。至于动态调用DLL的话,根本用不上L...

youqingyike的专栏 372

dll与lib的导入

OK组件和组件接口可以说是dll的一种高级应用了 接下来我们试着实现以下最简单的从dll和lib的调用 lib这次不用再编译环境设置路径的方式而是利用 #pragmacomment(lib,"..//Debug//FuncDll.lib") 这种方式相当于直接指定lib路径 我们只需要一个头文件就可以了 我记得在windowsAPI中包含声音实现的部分也是这样弄得 结果...

qq_40272523的博客 297

Windows的DLL与LIB的关系与区别

转自:windows下lib 和 dll 的区别、生成以和使用详解 静态库:在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中,这种库称为静态库,其特点是可执行文件中包含了库代码的一份完整拷贝;缺点就是被多次使用就会有多份冗余拷贝。即静态库中的指令都全部被直接包含在最终生成的 EXE 文件中了。在vs中新建生成静态库的工程,编译生成成功后,只产生一个.lib文件 动态库:动态链接库是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。动态链接提供了一种方法,使进程

Dead_Rabbit6_0的博客 317

lib和dll的区别,生成以及使用详解

静态库:在链接步骤中,连接器将库文件取得所需的代码,复制到生成的可执行文件中,这种库叫做静态库,其特点是可执行文件中包含了库代码的一份完整拷贝;缺点就是被多次使用就会有多份冗余拷贝。即静态库中的指令全部被直接包含在最终生成的exe文件中。在vs中新建生成静态库的工程,编译生成成功后,只产生一个.lib文件。 动态库:动态库链接是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行的文件...

Cutepingping的博客 1万+

win32下,lib和dll的区别与制作

/*win32 静/动态库制作与使用*/  chinanetboy .dll 和.lib 都是程序集合,便于代码重用。都是二进制的文件。 . dll 也叫动态链接库,与程序链接的方式为运行时链接(run-time linked ),为PE (portable executable )格式,也就是程完整的程序。. exe 、.dll 、.fon 、.mod 、.drv 、.oc

rong1234rong的专栏 674
上一篇: A* 寻路算法
下一篇: C#中委托和事件的区别
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

独立游戏开发指南

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值