程序运行时显示:msvcr100.dll /msvcr100d.dll 丢失--->解决方案在此

来源:互联网 发布:mac下启动盘制作工具 编辑:程序博客网 时间:2024/05/16 13:58

本人原来的问题帖http://bbs.csdn.net/topics/390781716,解答见斜体字后面(lz可是花了20积分的,看到有用的记得顶一下哦)


编译环境:本人编译环境VS2010 pro,运行于windows7 32bit ultimate下。

 测试环境:洁净的 WIndows 7 64bit Ultimate 和 Windows 8.1 32bit pro,未安装任何编程软件。
 问题:本人尝试编译一个很小的程序,构建一个项目之类的,编译链接完全没问题。在本机运行良好。
           debug版本运行于测试环境,提示丢失msvcr100d.dll。
           release版本运行于测试环境,提示丢失mscvr100.dll。

现状:本人使用VS自带的命令提示符(VS_CMD)编译的程序完好运行于测试环境。编译命令是cl(cl.exe)。
            而VS搞一个项目编译出的却不行,为什么?求解决方案。不是复制dll文件什么的,谢谢!!

PS:本人查看VS项目的log文件看到其编译使用的程序也是cl.exe.


log文件内容如下:

生成启动时间为 2014/5/9 19:17:17。
     1>项目“F:\testChar\ix32or64\ix32or64\ix32or64.vcxproj”在节点 2 上(rebuild 个目标)。
     1>_PrepareForClean:
         正在删除文件“Release\ix32or64.lastbuildstate”。
       InitializeBuildStatus:
         正在创建“Release\ix32or64.unsuccessfulbuild”,因为已指定“AlwaysCreate”。
       ClCompile:
         C:\Program Files\Microsoft Visual Studio 10.0\VC\bin\CL.exe /c /Zi /nologo /W3 /WX- /O2 /Oi /Oy- /GL /D WIN32 /D NDEBUG /D _CONSOLE /D _UNICODE /D UNICODE /Gm- /EHsc /MD /GS /Gy /fp:precise /Zc:wchar_t /Zc:forScope /Fo"Release\\" /Fd"Release\vc100.pdb" /Gd /TP /analyze- /errorReport:prompt isX64orX86.cpp
         isX64orX86.cpp
       Link:
         C:\Program Files\Microsoft Visual Studio 10.0\VC\bin\link.exe /ERRORREPORT:PROMPT /OUT:"F:\testChar\ix32or64\Release\ix32or64.exe" /INCREMENTAL:NO /NOLOGO kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /MANIFEST /ManifestFile:"Release\ix32or64.exe.intermediate.manifest" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"F:\testChar\ix32or64\Release\ix32or64.pdb" /SUBSYSTEM:CONSOLE /OPT:REF /OPT:ICF /LTCG /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:"F:\testChar\ix32or64\Release\ix32or64.lib" /MACHINE:X86 Release\isX64orX86.obj
         正在生成代码
         已完成代码的生成
         ix32or64.vcxproj -> F:\testChar\ix32or64\Release\ix32or64.exe
       Manifest:
         C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin\mt.exe /nologo /verbose /outputresource:"F:\testChar\ix32or64\Release\ix32or64.exe;#1" /manifest Release\ix32or64.exe.intermediate.manifest
       FinalizeBuildStatus:
         正在删除文件“Release\ix32or64.unsuccessfulbuild”。
         正在对“Release\ix32or64.lastbuildstate”执行 Touch 任务。
     1>已完成生成项目“F:\testChar\ix32or64\ix32or64\ix32or64.vcxproj”(rebuild 个目标)的操作。

生成成功。

已用时间 00:00:02.41


如果你习惯使用VS_CMD,可以使用在编译选项中加上/MD 或者/MT试试。详情见cl /?提示。

如果是直接使用VS_Project形式,可以在项目属性->配置属性-> C/C++ -> 代码生成 ->运行库,此项改为/MT或者/MTd。建议前者,因为文件会小很多;)


原理如下:

(1)/MT和/MTd表示采用多线程CRT库的静态lib版本。该选项会在编译时将运行时库以静态lib的形式完全嵌入。该选项生成的可执行文件运行时不需要运行时库dll的参加,会获得轻微的性能提升,但最终生成的二进制代码因链入庞大的运行时库实现而变得非常臃肿。当某项目以静态链接库的形式嵌入到多个项目,则可能造成运行时库的内存管理有多份,最终将导致致命的“Invalid Address specified to RtlValidateHeap”问题。另外托管C++和CLI中不再支持/MT和/MTd选项。


(2)/MD和/MDd表示采用多线程CRT库的动态dll版本,会使应用程序使用运行时库特定版本的多线程DLL。链接时将按照传统VC链接dll的方式将运行时库MSVCRxx.DLL的导入库MSVCRT.lib链接,在运行时要求安装了相应版本的VC运行时库可再发行组件包(当然把这些运行时库dll放在应用程序目录下也是可以的)。 因/MD和/MDd方式不会将运行时库链接到可执行文件内部,可有效减少可执行文件尺寸。当多项目以MD方式运作时,其内部会采用同一个堆,内存管理将被简化,跨模块内存管理问题也能得到缓解。

原理介绍详情参照http://blog.csdn.net/wqvbjhc/article/details/6612099


0 0