![]() |
【转帖】visual studio R6034解决方案集
摘自:http://www.cnblogs.com/lain/archive/2008/09/16/1291955.html
能查到的解决方法都在里面有提及: 我是使用 stdafx.h加入这句 code #pragma comment(linker, "\"/manifestdependency:type='Win32' name='Microsoft.VC80.CRT' version='8.0.50608.0' processorArchitecture='X86' publicKeyToken='1fc8b3b9a1e18e3b' language='*'\"") 解决的 vs2008的话改成VC90.CRT version='8.0.50608.0' 改成你的vs的版本. 以下是转载的全文 一个项目从vc6迁移到VS2005,在修改了一系列的类型警告后。编译成功了,Debug的时候,结果却冒出一个R6034错误:"An application has made an attempt to load the C runtime library incorrectly. Please contact the application's support team for more information." Output Window:app.exe 中的 0x7c984ed1 处最可能的异常: 0xC0000142: DLL Initialization Failed。 编译条件是:Linker->Manifest File ->Allow Isolation:Yes。 在同样的编译条件下,Release则可以正常编译运行。 采取解决措施:在stdafx.h文件中加入: #pragma comment(linker, "\"/manifestdependency:type='Win32' name='Microsoft.VC80.CRT' version='8.0.50608.0' processorArchitecture='X86' publicKeyToken='1fc8b3b9a1e18e3b' language='*'\"") 之后,调试中出现若干错误,屏蔽掉错误代码,可以运行,只是最前面的一个splash窗体没有了。 (参考:http://forums.microsoft.com/china/ShowPost.aspx?PostID=1988459&SiteID=15) 在此之前,参考了很多关于R6034错误的网页,主要是考虑manifest: (1)磁盘系统是fat32格式的:FAT32的时间精度不够,所以linker在生成文件的时候会出错,如果是ntfs的就没有问题.VS2005项目设置里面在清单工具(Manifest Tool)下面有一个选项"使用FAT32解决办法"(Use FAT32 work around)是专门解决这个问题的.对于FAT32的磁盘,需要选择"Yes",默认是"No". (2)Visual Studio 2005用向导生成的项目,在运行时可能会遇到找不到MFC80UD.dll的问题。这个问题可能是Manifest 引起的,因此我们可以通过修改项目属性(properties)->清单工具(property pages)->链接(linker)-->manifest file -->Allow Isolation,把“嵌入清单”选“否”,.然后编译、链接、运行即可。 Visual Studio 2005用向导生成的项目,在运行时可能会遇到找不到MFC80UD.dll的问题。这个问题可能是Manifest 引起的,因此我们可以通过修改项目属性->清单工具->输入输出,把“嵌入清单(Embed Manifest)”选“否”,.然后编译、链接、运行即可。 (3)有人提示,在项目属性里,mfc的使用应该设置为静态链接。但我改成静态后,会有很多错误,于是放弃。 (4)问了一个论坛上的网友,他说可能和Microsoft C++ Runtime Library有关系。 除此之外,一个参考文献上说的解决方法是:将Linker->Manifest File ->Allow Isolation:Do not Allow Side by Side isolation,则无论在Debug和Release条件,都出现如下:This application has failed to start because MSVCR80D.dll was not found. Re-installing the application may fix the problem." 关于这个问题,有篇博客文章上说: VS2005在FAT32分区的介质上对于Win32程序编译的一些注意 问题描述:大部分的vs.net 2005的用户在新建“win32项目-windows应用程序”的时候,新建的工程都通不过去,出现如下提示: Solution to “MSVCR80D.dll not found” “没有找到MSVCR80D.dll,因此这个应用程序未能启动。重新安装应用程序可能会修复此问题。” 问题所在:由于vs.net 2005 采用了一种新的DLL方案,搞成一个exe还要配有一个manifest文件(一般在嵌入文件里了,所以看不到,不过也可以不嵌入,这样会生产一个<程序名>.exe.manifest的文件,没它exe自己就转不了了:)这是个新功能,微软弄了个新工具(mt.exe),结果不好用,好像是fat32下时间戳有问题(在ntfs下这个问题就没有了),搞得manifest有时嵌入不到exe中(默认配置是嵌入的,所以就报错找不到dll了。 解决方案 1. 微软的解决方案。 在“属性->配置属性->清单工具->常规“下有一个”使用FAT32解决办法,设置为"是" 2. 找到你的工程的文件夹,如(myproject),找到其下的myproject\myproject\Debug\,Delete it. 参考: 1。http://www.grimes.demon.co.uk/workshops/fusWSThirteen.htm 2。http://blogs.msdn.com/nikolad/articles/427101.aspx 3。http://blog.csdn.net/fjnucse/archive/2007/09/06/1774190.aspx 4。http://msdn2.microsoft.com/zh-cn/library/ms235560(vs.80).aspx 5。http://www.3800hk.com/Article/cxsj/cjiajia/txtxdmtcjj/2007-04-02/Article_125561.html 6。http://msdn2.microsoft.com/en-us/library/ms235342.aspx 7。http://msdn2.microsoft.com/en-us/library/ms235624(VS.80).aspx 8。http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=130240&SiteID=1 9。http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=94312&SiteID=1 10。http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=190815&SiteID=1 11。http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=208118&SiteID=1 12。http://forums.microsoft.com/china/ShowPost.aspx?PostID=1988459&SiteID=15 |
回复: 【转帖】visual studio R6034解决方案集
Manifest的问题
嗯 开始试着使用免费下载的Visual Studio 2005 Express Edition了 还是挺好用的,以前的很多程序也都顺利地移植到了新的开发环境下,编译器和IDE都多了好多选项,正在熟悉中 比较困惑的是Manifest,呵呵 编译出来的程序 即使是Native的,离了它也运行不了,会找不到dll报错,除非把它embed进exe文件 后来查了查 基本明白了,具体的说是这样的: dll是被动态调用的,所以会被若干个程序共享使用的 但是如果dll在应用程序不知道的情况下升级了、或是被另一个程序更改了,就可能会出现问题,即"DLL Hell" 随着系统资源越来越丰富,硬盘不那么紧张,所以在XP以后的操作系统中,用新的机制来管理DLL (这种机制,这不仅仅是对于.NET而言,对于普通的Native程序也是一样的) Madifest是个XML的描述文件,对于每个DLL有DLL的Manifest文件,对于每个应用程序Application也有自己的Manifest 对于应用程序而言,Manifest可以是一个和exe文件同一目录下的.manifest文件,也可以是作为一个资源嵌入在exe文件内部的(Embed Manifest) XP以前版本的windows,会像以前那样执行这个exe文件,寻找相应的dll,没有分别 Manifest只是个多余的文件或资源,dll文件会直接到system32的目录下查找,并且调用 而XP以后的操作系统,则会首先读取Manifest,获得exe文件需要调用的DLL列表 (此时获得的,并不直接是DLL文件的本身的位置,而是DLL的manifest) 操作系统再根据DLL的Manifest去寻找对应的DLL <因此就可能区别不同版本的同一个DLL文件,或是指定一个程序本身Isolated的DLL> 不过使用Visual Studio 2005以后的一个新问题是, VS2005带的8.0新版的C运行库(VC 8.0 CRT)文件在XP以后支持manifest的Windows版本中被调用时, 将会check一下Application自身的Manifest,否则将会拒绝被调用 这也就是说,使用Visual Studio开发的Application,Manifest将是必不可少的 (搞不懂MS为啥要这样设置,所以与VS2003.NET不同了) (后来想想,除了MS自己说的哪些冠冕堂皇的原因,至少这样一来Linux的Wine模拟要麻烦多了) 除非,你的程序是静态链接的,没有使用dll,只使用了操作系统核心的 Kernel32.dll, User32.dll, Ole32.dll, 或ShDocVW.dll 等 project的设置必须是Use Standard Windows Libraries、Not Using ATL、No Common Language Runtime support 那么你可以不需要考虑Manifest 可以关掉它 VS2005中Menifest相关的设置: Project/Properties/Linker/Manifest File/Generate Manifest 决定是否生成Manifest,如上情况才可以关闭 Project/Properties/Linker/Manifest File/Allow Isolation 这个是设置DLL的调用的,并不能决定Manifest是否还是必须的 Project/Properties/Manifest Tool/Input and Output/Embed Manifest 决定Manifest是个单独的文件还是嵌入到exe内的资源 【对于我来说,使用SDL必须是启用DLL的动态链接方式,所以必须开启Manifest,并且让Manifest Embed进入exe比较方便】 【与上面内容相应的 是关于如何发布软件的问题,事实上只有VC6.0的CRT库是绑定作为Windows的一部分的,之后从VS.net开始,VC程序制作安装包也是要考虑库文件的,只不过VC6.0时推荐拷入System32,VC.net时推荐放在exe文件local目录,而现在VS2005则还需要考虑Manifest的问题了,看似麻烦,其实也还好,VS自带工具打包,下面一些网址也有讲如何手工做redistribution】 参考网址: http://msdn2.microsoft.com/en-us/library/ms235342.aspx http://msdn2.microsoft.com/en-us/library/ms235265.aspx http://msdn2.microsoft.com/en-us/library/8kche8ah.aspx http://blog.kalmbachnet.de/?postid=54 http://blogs.msdn.com/nikolad/archive/2005/03/18/398720.aspx |
所有的时间均为北京时间。 现在的时间是 01:41 PM. |