动态链接库与静态链接库
首先纠正所谓“静态连接就是把需要的库函数放进你的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
=============
转载于:https://www.cnblogs.com/kaiyang/archive/2008/01/17/1042881.html
动态链接库与静态链接库相关推荐
- c++动态链接库及静态链接库的生成与使用
c++动态链接库及静态链接库的生成与使用 1,新建控制台工程xdltest,改属性-配置属性-常规-配置类型为 动态库.dll或静态库.lib 2,打开工程后添加 dltest.h, dltest.c ...
- linux 生成和使用动态链接库和静态链接库的Makefile编写
引用 Jesse Rei 的 linux 生成和使用动态链接库和静态链接库的Makefile编写 生成和使用动态链接库和静态链接库的Makefile编写 1. 概述 介绍linux下生成和使用动态链接 ...
- windows 调用linux .a lib,动态链接库及静态链接库(windows下的.dll .lib和linux下的.so .a)...
动态链接库及静态链接库(windows下的.dll .lib和linux下的.so .a) 库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀.例如:libhello.so libhello ...
- 动态链接库和静态链接库的区别
两种库: 一种是LIB包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamic link library. 一种是LIB包含函数 ...
- 关于动态链接库和静态链接库
关于动态链接库和静态链接库 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 本质上来说库是一种可执行代码的二 ...
- BCG 动态链接库和静态链接库
4.1 动态链接库和静态链接库 使用BCG界面库的应用程序,发布时可以以动态库或静态库的方式链接. BCG已经在BCGCBProInc.h文件中定义好了链接选项,我们只需要修改工程MFC的工程配置即可 ...
- Linux下Makefile中动态链接库和静态链接库的生成与调用
背景:写这篇博客的原因是:最近在搞嵌入式,需要交叉编译opencv库文件,自己写Makefile,通过arm-linux-g++编译.链接.生成可执行文件,从而实现了移植的过程.平台是Toradex的 ...
- C语言函数库:动态链接库与静态链接库
首先,函数库就是一些事先写好的函数的集合,是别人分享的,我们可以拿来使用的.经过一些校准和整理,就形成一份标准化的函数库.例如glibc 函数库有两种提供形式:动态链接库与静态链接库 早起函数库里的函 ...
- 动态链接库与静态链接库的区别
动态链接库与静态链接库的区别 库文件的概念 库文件是计算机上的一类文件,提供给使用者一些开箱即用的变量.函数或类.库文件分为静态库和动态库,静态库和动态库的区别体现在程序的链接阶段:静态库在程序的链接 ...
最新文章
- 地牢逃脱(BFS(广度优先搜索))
- linux管道原子性写入,write(2)/ read(2)linux中进程之间的原子性
- .Net中DataTable的保存
- 长语音识别体验_如何为语音体验写作
- Mysql数据库常用分库和分表方式
- Pentium Pro架构/流水线及其优化 (3) - 指令流水线/乱序执行核/高速缓存/分支预测/指令预取
- 运行tuxedo自带例子simpapp,测试tuxedo安装
- c++ -- 重载、重写(覆盖)和隐藏的区别
- 超简单的ubuntu下安装teamview教程
- 用Python编写日麻牌理查询器
- Drool规则引擎详解(一)
- CentOs7中安装python模块psycopg2,报错Error: pg_config executable not found.
- JS原创小游戏 旋转方块(源码)
- 计算机无法读取tf卡,tf卡修复工具不好用教你电脑不识别TF卡的解决办法
- 刘世光 计算机图像学,刘世光
- 我爱K歌软件 v1.6.6.4001 官方版
- 微信小程序网络请求异常怎么办_微信小程序网络超时的处理
- ATAC-seq数据分析(一)
- Javascript TypedArray 解惑:Uint8Array 与 Uint8ClampedArray 的区别
- 简易的MySQL主从复制