常用VS开发软件的同学们经常会遇到“程序在本机运行正常,拷贝到其他电脑上运行会报***.DLL缺失”的问题,本人也是深受该问题折磨,在此对该类问题做一个总结。为了方便问题的描述,我将开发程序的电脑称为“developer",运行程序的电脑称为”runner“。
一、追根索源
表面上看,此类问题一般由两种原因引起:一是runner没有安装VS开发环境;二是runner的VS版本与developer不一致。具体细究起来,又可以发现,一般缺这么几个库(分为release和debug:
1,release版
mfc100.dll msvcp100.dll msvcr100.dll
2,debug版
mfc100d.dll msvcp100d.dll msvcr100d.dll
注:以上仅以vs2010为例,如果是vs2012或vs2013,则其中的数字分别为110和120。而vs2015不遵循这个规则,它引入了Universal CRT(C-Runtime),后面专门说。
其中,mfc100.dll是MFC工程相关的库,另外两个是Mircrosoft Visual C++ Runtime Library相关的库。
如果新建的工程是MFC工程或MFC DLL库,则必须包含MFC库。因此,我们新建工程的时候,如无必要,尽量新建为win32 console工程或win32 DLL工程,这样就不需要包含MFC的库。
而另外两个CRT库是微软的VC++编译器依赖的C-Runtime库,不同的C/C++编译器有不同的C-Rumtime库。不同版本的编译器也不相同,故有msvcp*.dll和msvcr*.dll。
3,VS2015的CRT的变化
到VS2015的时候,CRT的包含规则发生了一些变化,可以参考MSDN上Visual C++团队的博客:Introuducing the Universal CRT。具体包括:
1)msvcr*.dll不再存在了,它的功能被分散到编译器版本相关的”vcruntime140.dll“和操作系统相关的”ucrtbase.dll“。
2)”ucrtbase.dll“是操作系统的一部分,不能像之前的msvcr*.dll,直接拷贝到*.exe下就可运行,而是需要在runner上安装VS2015的”redis.exe“(redistribution)。
3)CRT相关的头文件、源文件和库文件从 C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC 迁移到了C:\Program Files (x86)\Windows Kits\10 。
4)它包含有以下几个版本