动态链接库与静态链接库

C++静态链接库与动态链接库的优缺点 C++中的静态链接库(Static Link Libraries,通常是.lib或.a文件)和动态链接库(Dynamic Link Libraries,通常是.dll文件在Windows上,或.so文件在Unix/Linux系统上)都是用来在程序中重用代码的手段,但它们在链接和运行时行为上有显著不同。在选择使用静态库还是动态库时,需要根据具体的应用场景、部署需求和性能要求来决定。通常情况下,如果希望简化部署并且程序体积不是主要关注点,静态链接可能是一个好选择; 阅读详情
 

首先纠正所谓“静态连接就是把需要的库函数放进你的exe之中”的说法。在真实世界中,有三个概念:Use   static   libary,   static   linked   DLL,   dynamic   linked   DLL.   
  多数人混淆了static   libary   和   static   linked   DLL的概念,当然他们有似是而非的“相似之处”,比如都用到.lib,下面具体说明。   
          使用静态库(Use   static   libary)是把.lib和其他.obj一起build在目标文件中,目标文件可以是.exe,也可以是.dll或.oxc等。一般情况下,可以根本就没有“对应的”.dll   文件,如C   Run   Time(CRT)库。一个例子就是,写一个main(){},build出来并不是只有几个字节,当然有人会说那还有exe文件头呢?是,即使加上文件头的尺寸,build出的执行文件仍然“莫名的大”。实际上那多出来的部分就是CRT静态库。姑且可以把静态库.lib理解成外部程序的obj文件比较合理,它包含了函数的实现。   
          下面再谈static   linked   DLL   和   dynamic   linked   DLL又如何?   
          静态链接   (static   linked   DLL)从操作上在VC的Project|Settings...|Link   (tab)|General   (category)|Object/library   modules   中设置和添加。比如要使用SDK中的PropertySheet()   API,   就要在这里添加   comctl32.lib,然后再调用的源程序中#include   <prsht.h>,   使用的地方直接调用PropertySheet()。当程序.exe启动时,系统会把对应comctl32.dll加载进来。作为DLL的静态引入库的.lib不包含函数的实现,只包含用于系统加载的信息,如对应的DLL名称,函数歧视地只在对应的DLL中的便宜等等。相比动态链接而言,静态链接是很简单的。   
          动态链接是使用LoadLibrary()/GetProcessAddress()和FreeLibrary(),详见下面的例子。   
    
          {   
                  typedef   BOOL     (WINAPI   *LPFNSHELLEXECUTEEX)(LPSHELLEXECUTEINFO);   
    
                  hShell32Dll   =   LoadLibrary(TEXT("SHELL32.DLL"));   
                  if   (!hShell32Dll)   {   goto   End;   }   
    
                  lpfnShellExecuteEx   =   (LPFNSHELLEXECUTEEX)GetProcAddress(hShell32Dll,   
                          API_NAME(ShellExecuteEx));   
                  if   (!lpfnShellExecuteEx)   {   goto   End;   }   
    
                  ...   
                  fOk   =   (*lpfnShellExecuteEx)(pShellExecuteInfo);   
                  ...   
          End:   
                  if   (hShell32Dll)   {   
                          FreeLibrary(hShell32Dll);   
                  }   
                  lpfnShellExecuteEx   =   NULL;   
                  ...   
          }   
  有人会想,动态链接这样麻烦,为什么还要用呢?这里有一个技术问题,对这个问题的解决直接导致了动态加载的需求。问题是有些DLL只在某个Windows版本中存在,或某个API只在某些Windows版本中被加入指定的DLL。当你使用静态链接的.exe试图在不支持的Windows版本上运行时,系统会弹出系统对话框提示某某.dll无法加载或无法定位某某API的消息,然后就中止.exe的运行。像这样因为个别功能的实现依赖于某个DLL,当这个DLL不可用时导致整个.exe无法运行是不明智的。避免这样的结局只有用动态链接。  


=============
不能运行是原因是没有MFC的动态链接库,只要把你的程序在需要的几个动态链接库一并拷到目标机器上就行了。   
    
  或者用静态链接到MFC   
  project   properties->configuration   properties->general,在user   of   mfc中选择use   mfc   in   a   static   library
=============

Verilog-asm小练习—PLL建模 Verilog- ams是Verilog标准的模拟混合信号语言,以下是对PLL建模的一种思路参考 阅读详情

相关推荐

OpenSceneGraph编译、安装、开发环境

详细描述WIndows 10下使用Visual Studio 2019编译OpenSceneGraph 3.6.5的操作流程

国产CAx(CAD/CAE/CAM)软件研发 8772

动态库与静态库 动态链接与静态链接

(ln -s/home/user/file.txt /home/user/link.txt,这个命令会在/home/user目录下创建一个名为link.txt的符号链接文件,指向/home/user/file.txt文件。将自己的动态库路径放入到环境变量中,再执行刚刚生成的可执行程序,发现可以成功执行了,而且使用的是动态库中的函数接口。当执行到库函数的时候由运行时的链接文件跳转到系统中的标准库中,去链接标准库中库函数的.o文件。静态库:库文件,以.a为后缀(Windows中为.lib)

C1238888的博客 2817

FIFO的工作原理及其设计

FIFO( First Input First Output)简单说就是指先进先出。FIFO存储器是一个先入先出的双口缓冲器,即第一个进入其内的数据第一个被移出,其中一个口是存储器的输入口,另一个口是存储器的输出口。对于单片FIFO来说,主要有两种结构:触发导向结构和零导向传输结构。触发导向传输结构的FIFO是由寄存器阵列构成的,零导向传输结构的FIFO是由具有读和写地址指针的双口RAM构成。FIFO与普通RAM存储器的是没有外部读写地址线(指针),使用方便,但。

Jackiezhang1993的博客 2万+

静态链接库和动态链接库

一、静态链接库和动态链接库 1、制作方法 2、动态库制作中extern “C” _declspec(dllexport)导出,才会生成lib文件 3、查看动态库生成的接口 二、静态链接和动态链接 1、静态库的链接 2、动态库的链接 1)LoadLibrary、GetProcAddress、FreeLibrary 2)导出lib的动态库可根据lib和头文件隐式链接 三、 #ifdef TESTDLL_EXPORTS #define TESTDLL_API __declspec(dllexport) #else

qq_43148810的博客 4935

dxf-viewer 查看器

dxf-viewer SDK 的示例,它是一个基于 Three.js 和 Vue3 构建的基于 WebGL 的 BIM 模型查看器。它用于查看 DWG/DXF/PDF 文件。面积测量 - 角度测量 -标记。

qq_25547755的博客 866

用STM32F103单片机控制电调制动无刷电机

用电调控制无刷电机制作遥控飞艇 蓝牙控制 调控电调 无刷电机 用电调控制无刷电机制作遥控飞艇 代码区 mian.c #include "delay.h" #include "sys.h" #include "usart.h" #include "usart3.h" #include "timer.h" #include "led.h" #include "key.h" int main(v...

子非鱼 的博客 2万+

静态链接库与动态链接库

静态库与动态库

Star_ID的博客 1773

GD32F303开发实战(一):从零搭建MDK工程与时钟配置详解

本文详细介绍了如何从零开始为GD32F303微控制器搭建一个清晰、可维护的MDK工程模板。内容涵盖开发环境准备、工程目录结构规划、文件分组管理、关键工程配置,并重点解析了时钟树原理,手把手指导配置108MHz系统时钟。通过实战步骤与常见问题排查,帮助开发者构建一个稳定可靠的开发基础,便于后续功能扩展。

weixin_29174141的博客 270

静态链接库与动态链接库详解

以下内容源于C语言中文网相关内容的学习整理,如有侵权请告知删除。

主要记录嵌入式学习与开发过程。 9307

PyTorch实战(30)——使用TorchScript和ONNX导出通用PyTorch模型

在本节中,我们将深入探讨使用 TorchScript 导出 PyTorch 模型。通过序列化,TorchScript 使模型与 Python 生态系统独立,从而使得模型可以在其他环境中加载,例如基于 C++ 的环境。我们还跨越 Torch 框架与 Python 生态的边界,研究机器学习通用开放格式 ONNX,该技术能帮助我们将 PyTorch 训练的模型导出至非 PyTorch 甚至非 Python 环境。

盼小辉丶的博客 3524

11、ThingsBoard集群部署k8s

今天终于有时间去搞这个啦,拖了很久了,一直没时间,因为我本地没有那么多机器资源,开虚拟机不够,如果租用阿里云服务器,需要有充值的时间,因为这个费用是按小时付费,需要有连贯的时间来搞才行,今天恰好有时间,就开始搞了,弄成功搞出来了,特地写博客记录下来。

AldrichEugene 990

6、静态链接库、动态链接库

静态链接库、动态链接库

融码一生:专注 Python、C/C++、Linux、机器学习 & 深度学习、NLP、算法领域分享 1610

芯片测试:WAT、CP、FT

最近部门来了一个日本回来的同事,虽然他尽量用非常Poor的中文给我解释一些东西,其中还夹杂着一些英文让我很受挫,于是最近来学一下WAT中的常用的单词含义。直接去查缩写、查单词很难去记住,要把具体的东西放在具体的场景,引发知识的连接才会在脑子里留下一定的映像。感兴趣的一起来学习一下这篇不错的文章吧。注释是我查询记录,如有不妥,欢迎指出修正。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 5084

【基础】动态链接库/静态链接库的区别

C或C++程序从源文件到生成可执行文件需经历4个阶段分别为预处理、编译、汇编和链接。链接阶段所要完成的工作,是将同一项目中各源文件生成的目标文件和程序中用到的库文件整合为一个可执行文件。虽然库文件明确用于,但编译器提供了2种实现链接的方式,分别称为静态链接和动态链接。采用静态链接方式实现链接操作,的库文件称为静态链接库;采用动态链接方式实现链接操作,的库文件称为动态链接库。在Linux发行版系统中,静态链接库文件的后缀名通,动态链接库的后缀名通;,动态链接库的后缀名。...

weixin_41838721的博客 8122

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

静态链接库和动态链接库的区别

目录 1、链接库概述 2、静态链接库 2.1、编辑测试文件 2.2、将.c 编译生成 .o文件 2.3、由 .o 文件创建.a静态库 2.4、在程序中使用静态库 2.5、生成目标程序main,然后运行 3、动态库(隐式链接) 3.1、由 .o创建.so动态库 3.2、隐式方式使用动态库 3.3、动态库的初始化和解析 1、动态库的构造和析构函数机制 2、全局变量初始化 4.........

weixin_36670529的博客 4372

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

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

动态链接库和静态链接库的区别

静态连接库就是把(lib)文件中用到的函数代码直接链接进目标程序,程序运行的时候不再需要其它的库文件;动态链接就是把调用的函数所在文件模块(DLL)和调用函数在文件中的位置等信息链接进目标程序,程序运行的时候再从DLL中寻找相应函数代码,因此需要相应DLL文件的支持。  静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的

4万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

静态链接库与动态链接库区别

一、        静态链接库与动态链接库区别 静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了。但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE 独立的 DLL 文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包

OnWay的专栏 3720

关于静态链接库与动态链接库的区别和实例

所谓静态链接库(Static Link Library),是在编译的链接阶段将库函数嵌入到应用程序的内部。但是如果多次调用,则该库函数会被调用多次,会极大的造成空间浪费以及链接器的负担(缺点)。它的优势在于,应用程序可以独立运行,因为在静态链接的时候已经将所需的组件都已经加载到了该应用程序中,不需要对应的DLL,但是应用程序比较大。 所谓动态链接库(Dynamic link library),与静...

Alan_Program的博客 3446

【C++】中动态链接库和静态链接库的区别

动态链接适用于那些希望减少最终二进制文件大小、允许独立更新库代码或需要在多个程序间共享库代码的情况。静态链接则更适合于那些需要确保二进制文件独立运行、不依赖于外部文件或需要更严格控制版本的应用场景。选择哪种方式主要取决于项目的具体需求、目标平台以及开发团队的偏好。

wangnaisheng的专栏 1753
上一篇: Google C++ Style
下一篇: Google开源了其C++测试框架 C++ Mocking框架
suacker
博客等级 码龄24年 46粉丝 19原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值