注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

秒大刀 博客

好好学习 天天向上

 
 
 

日志

 
 
 
 

R6034  

2011-01-14 10:49:46|  分类: C/C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
    某应用程序在Debug下启动时会报如下错误:
Microsoft Visual C++ Runtime Library
Runtime Error!
Program: XXX
R6034
An application has made an attempt to load the C runtime library incorrectly.
Please contact the application's support team for more information.
    项目配置为:WindowsXP SP3,VS2008 SP1,在共享DLL中使用MFC,使用多字节字符集,多线程调试DLL(/MDd),生成清单(是),嵌入清单(是)

    MSDN对R6034的解释为:
某个应用程序已经尝试不使用清单来加载 C 运行时库。这种加载 Visual C++ DLL 的方式不受支持。需要修改您的应用程序,以使用清单生成。有关更多信息,请参见产品文档中的主题“作为共享的并行程序集的 Visual C++ 库”。

应用程序必须使用清单加载 C 运行时库。有关更多信息,请参见 Visual C++ Libraries as Shared Side-by-Side Assemblies 和 Visual Studio 中的清单生成

在发布版本中,诊断消息为“某个应用程序已经尝试以不正确的方式加载 C 运行时库,请与应用程序技术支持团队联系,以便获得更多信息。”

更正此错误

  • 使用清单重新生成应用程序。使用 Visual Studio 生成应用程序会自动将清单放入生成的 EXE 或 DLL 文件中。如果要在命令行生成应用程序,请使用 mt.exe 工具将清单作为资源添加。如果要生成 EXE,请使用资源 ID 1;如果要生成 DLL,则使用 2。有关更多信息,请参见如何:将清单嵌入到 C/C++ 应用程序


    从以上解释推测,估计是程序的manifest出问题了。
  • 先用depends工具查看exe的dll依赖,报警告:Warning: At least one module has an unresolved import due to a missing export function in a delay-load dependent module。应该属于常规范畴。
  • 但检查项目manifest相关配置,完全是常规作法。
  • 联想到“只在exe中嵌入清单而不要在任何dll中嵌入清单”,确认项目也没有依赖任何非默认的dll。
  • 将目录Microsoft Visual Studio 9.0\VC\redust\Debug_NonRedist\x86下的VS2008 SP1调试版的运行时库文件拷贝到程序所在目录,为题未解决。
  • 记得VS2008 SP1有个生成程序的manifest版本号(9.0.21022.8)和运行时库manifest版本号(9.0.30729.1)不一致的bug,手工使其一致,仍未解决。

    没办法,继续请教Google R6034其中一篇(此页面排版混乱,但信息很有价值R6034 - 秒大刀 - 秒大刀的城堡)对于该问题描述如下:
  Microsoft's recommendation is very confusing. That is, it recommends to include a manifest file and to re-compile the project.
  I recently had a problem with 'R6034' error message even with a manifest file already included!
  In my case, Visual Studio 2005 compiles and builds a DEBUG-configuration of some DLL. But, as soon as I try to start an application that uses that DLL the loader can't load the DLL and displays an error message with error code 'R6034'.
  It happened because two Run-Time DLLs were referenced in my DLL by some reason! As soon as I looked inside of my DLL I found two strings: 'msvcr80d.dll' and 'msvcr80.dll', and the 2nd one is the reason of that run-time problem.
  In order to resolve the problem I added 'msvcrt.lib' to the list of ignored libraries for DEBUG-configuration:
    [Configuration Properties] -> [Linker] -> [Input] -> 'Ignore Specific Library' -msvcrt.lib
    如法炮制,有效!

结论:
    程序启动报R6034错误的,在链接选项中忽略msvcrt.lib库即可。

2011-12-16

    最近一直在用C++/CLI做C++项目的单元测试。当应用项目中加上某段代码后,测试项目运行结果全部为黄色感叹号错误。堆栈如下:

无法获取类型 ProjectTest.ClassTest,ProjectTest。错误:System.IO.FileNotFoundException:找不到指定的模块。(异常来自HRESULT:0x8007007E)

在 System.Reflection.Assembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection)

在 System.Reflection.Assembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection)

在 System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)

在 System.Reflection.Assembly.InternalLoadFrom(String assemblyFile, Evidence securityEvidence, Byte[] hashValue, AssemblyHashAlgorithm hashAlgorithm, Boolean forIntrospection, StackCrawlMark& stackMark)

在 System.Reflection.Assembly.LoadFrom(String assemblyFile)

在 Microsoft.VisualStudio.Tasteless.TestTypes.Unit.UnitTestExecuter.GetType(UnitTestElement unitTest, String type)

在 Microsoft.VisualStudio.Tasteless.TestTypes.Unit.UnitTestExecuter.ResoloveMethods()

    仔细查看所加的代码并无任何特殊之处,只是层次较深的调用了一些非托管代码。

    因用C++/CLI给C++做单元测试的人并不多,搜索引擎能提供的帮助也很有限。Running Unmanaged LoadTest on Test Agent fails一文提到的“重启机器法”在我这里无效,重开VS、删掉VS临时文件、Rebuild All也都用过了,均无效。

    看来这问题只能自己分析了:

  • 根据堆栈提示“System.IO.FileNotFoundException:找不到指定的模块”,这说明测试框架无法加载对应的可运行二进制
  • 查找解决方案中的TestResults/***/Out目录下对应的dll文件,存在。看来文件是正常编译好,一般不应该出现FileNotFoundException,莫非是文件损坏?
  • Reflector工具打开dll,正常。dll损坏可能不大
  • 以前遇到过dll加载失败的问题。dll加载失败并不一定是该dll本身有问题,还可能是该dll所依赖的其他dll无法找到!
  • depends工具开打dll,发现我Debug下的项目除依赖了MSVCR90D.DLL外还依赖了通常只在Release下才用到的MSVCR90.DLL!删掉引入问题的那段代码后,对MSVCR90.DLL的依赖消失。看来测试框架不能加载测试dll正是由于对MSVCR90.DLL的错误依赖引起的。
  • 幸好以前有此问题的处理经验,链接选项中排除msvcrt.lib库
  • 编译,运行所有测试,问题解决!

@VS2008 SP1, C++/CLI, C++ Win32静态库, Win7 x64操作系统

结论:

    若发现项目编译结果同时依赖Debug和Release的C/C++运行时库,需要在链接时排除msvcrt.lib



  评论这张
 
阅读(8442)| 评论(3)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017