当前位置:网站首页>静态库使用MFC和共享库使用MFC的区别
静态库使用MFC和共享库使用MFC的区别
2022-07-01 03:18:00 【三贝勒文子】
日常使用MFC开发动态链接库的时候,你可能会面临“MFC的使用”这个选项,这个选项里面有三种可选方案,分别是:
使用标准 Windows 库
在静态库中使用 MFC
在共享 DLL 中使用 MFC
那么这三种有什么区别呢?为什么要设置这三种方式呢?
根据小编在开发项目过程中所遇到的问题,按照自己的理解给大家揭开这三者的区别。
我们都知道,动态库是什么东西,不懂得小伙伴可以看小编之前整理的动态链接库文章,动态链接库通常不能直接在操作系统上运行,他在我们的电脑上呈现的后缀名为 .dll,同时它也不能接收消息。它是一个独立的文件,只有在某一个可执行文件(windows上是.exe)来调用才能够生效。众所周知,Windows API中所有的函数都包含在DLL中,其中有3个最为重要的DLL就是:
Kernel32.dll:包含用于管理内存、进程和线程的函数,例如CreateThread函数;
User32.dll:包含用于执行用户界面任务(如窗口的创建和消息的传递)的函数,例如CreateWindow函数;
GDI32.dll:包含用于画图和显示文本的函数。
当我们在创建MFC工程的时候,选择创建动态链接库工程,编译出来后会在生成库的文件路径下多生成一个引入库文件,这个引入库文件的后缀名也是“lib”,例如下图中的Serven.lib文件:
但是,动态链接库的引入库文件和静态库文件有着本质的区别,对一个DLL来说,其引入库文件包含该DLL导出的函数和变量的符号名,而DLL文件包含该DLL实际的函数和数据。在使用动态库的情况下,在编译链接可执行文件时,只需要链接该DLL的引入库文件,该DLL中的函数代码和数据并不复制到可执行文件中,直到可执行文件运行时,采取加载所需的DLL,将该DLL映射到进程的地址空间中,然后访问DLL中导出的函数。这时,在发布产品时,出了发布可执行文件外,还需要发布该程序要调用的动态链接库,如下图所示,假设我们的可执行程序为Servenexe.exe,DLL库文件为Serven.dll,在发布的时候将这两个文件打包成一个文件夹一起发布。
说了这么多,我们来看一下“使用共享动态MFC DLL的规则(D)”和“带有静态链接MFC的规则”。
使用共享动态MFC DLL的规则(D):
编译器在编译的时候,不会把MFC的库函数给编译进来,也就是,当我们在DLL程序中使用了MFC的库函数(例如CreateWindows()),编译器不会把这个函数编译进来,所以这个要求要运行这个dll文件的电脑上必须安装过MFC库函数,也就是安装MFC的环境。如果电脑上没有安装的话,那么就会出现下面这个报错:
提示你没有,程序没有找到相应的MFC库函数。使用这种方式的缺点就是要求运行该库的电脑上必须安装相应的MFC库函数。
使用“带有静态链接MFC的规则”的方式:
编译器在编译的时候,会把MFC的库函数给编译进来,也就是,当我们在DLL程序中使用了MFC的库函数(例如CreateWindows()),编译器会把这个函数编译进来,所以这个不要求要运行这个dll文件的电脑上必须安装过MFC库函数,也就是安装MFC的环境。但是这个有一个缺点就是编译后的dll的大小会比使用共享动态的方式要大。
总结:
使用标准Windows库:只能用在非MFC工程中,如果在MFC工程会导致代码编译报错;
在共享DLL中使用MFC:生成的程序可执行文件比较小,但是要求目标机器上必须安装必要的MFC库文件;
在静态库中使用MFC:生成的程序可执行文件几乎所有的Windows都可以执行,但是这个程序生成后占用的内存会比较大,因为程序包含了必要的MFC库文件,可以保证在别的机器上正常运行。
边栏推荐
- 过滤器 Filter
- CX5120控制汇川IS620N伺服报错E15解决方案
- 深度学习中的随机种子torch.manual_seed(number)、torch.cuda.manual_seed(number)
- 用小程序的技术优势发展产业互联网
- A few lines of transaction codes cost me 160000 yuan
- 排序链表(归并排序)
- How do I use Google Chrome 11's Upload Folder feature in my own code?
- 在线公网安备案保姆级教程【伸手党福利】
- Nacos
- EDLines: A real-time line segment detector with a false detection control翻译
猜你喜欢
The combination of applet container technology and IOT
pytorch nn.AdaptiveAvgPool2d(1)
The preorder traversal of leetcode 144 binary tree and the expansion of leetcode 114 binary tree into a linked list
Latest interface automation interview questions
IPv4 and IPv6, LAN and WAN, gateway, public IP and private IP, IP address, subnet mask, network segment, network number, host number, network address, host address, and IP segment / number - what does
Cookie&Session
Feature Pyramid Networks for Object Detection论文理解
BluePrism注册下载并安装-RPA第一章
文件上传下载
[us match preparation] complete introduction to word editing formula
随机推荐
JUC学习
ctfshow爆破wp
后台系统页面左边菜单按钮和右边内容的处理,后台系统页面出现双滚动
GCC usage, makefile summary
pytorch训练深度学习网络设置cuda指定的GPU可见
Overview of EtherCAT principle
Stop saying that you can't solve the "cross domain" problem
Leetcode 128 longest continuous sequence (hash set)
服务器渲染技术jsp
pytorch nn. AdaptiveAvgPool2d(1)
Avalanche problem and the use of sentinel
Leetcode:剑指 Offer 59 - I. 滑动窗口的最大值
Hello World generation
Appium自动化测试基础--补充:C/S架构和B/S架构说明
10、Scanner.next() 无法读取空格/indexOf -1
[reading notes] copywriting realization -- four golden steps for writing effective copywriting
Nacos
File upload and download
串口接收数据方案设计
过滤器 Filter