最近想写一些MFC应用程序,在发布的时候遇到了几个问题,从中得到了一点体会,与大家分享一下。
遇到的几方面问题的起因:
1. 自己用VS(刚换Win7)编译好的程序在其他人那里无法运行,提示缺少MFC库;
2. 上面的问题好解决,用静态MFC方式重新发布,却发现原本200多K的程序变成了1M多。
3. 之前使用VC6.0(原来是WinXP)开发的程序从来没有出过1中的问题,故使用VC6.0以动态MFC库的方式对程序进行编译,在其他器机上正常运行,问题出在哪里?
在用VS(VC6.0之后版本)编译器对MFC项目进行编译时,如果使用的是MFC动态链接的方式,可执行程序是无法在没有装有开发环境的机器上运行,弹出与“无法找到MFCXX.dll”相似的MFC库文件不存在的错误提示对话框;然而这样的问题在VC6.0编译后的可执行程序上不存在。
经过对刚装完的Windows系统的windows/system32目录下的动态库进行分析后可以看到,系统中初始就包括mfc42.dll文件,这个文件就是vc6.0使用的MFC动态库(可参见MFC的版本更新,从中也可以看到mfc42.dll是从98之后就包含在系统中了)。
Windows XP SP2系统中的MFC库文件
Windows 7系统中的MFC库文件
如果以静态的方式进行编译MFC应用程序的话,可执行程序(.exe)文件大小会是动态链接的好几倍!所以说,如果不想使发布的程序体积过大,并且程序没有使用到新版MFC中的功能的话(就像改键工具),最好使用VC6.0以动态DLL方式进行编译。
版本更新
新产品版本 MFC版本
Microsoft C/C++ 7.0 MFC 1.0
Visual C++ 1.0 MFC 2.0
Visual C++ 1.5 MFC 2.5
Visual C++ 2.0 MFC 3.0
Visual C++ 2.1 MFC 3.1
Visual C++ 2.2 MFC 3.2
Visual C++ 4.0 MFC 4.0 (mfc40.dll included with Windows 95)
Visual C++ 4.1 MFC 4.1
Visual C++ 4.2 MFC 4.2 (mfc42.dll included with the Windows 98 original release)
eMbedded Visual C++ 3.0 MFC 4.2 (mfc42.dll)
Visual C++ 5.0 MFC 4.21 (mfc42.dll)
Visual C++ 6.0 MFC 6.0 (mfc42.dll)
eMbedded Visual C++ 4.0 none
Visual C++ .NET 2002 MFC 7.0 (mfc70.dll)
Visual C++ .NET 2003 MFC 7.1 (mfc71.dll)
Visual C++ 2005 MFC 8.0 (mfc80.dll)
Visual C++ 2008 MFC 9.0.21022 (mfc90.dll)
Visual C++ 2008 with Feature Pack MFC 9.0.30411 (mfc90.dll)