引起C运行时错误R6034的原因和解决方法

来源:互联网 发布:守望先锋设置优化fps 编辑:程序博客网 时间:2024/04/28 04:12

An application has made an attempt to load the C runtime library without using a manifest.
某个应用程序已经尝试不使用清单来加载 C 运行时库。这种加载 Visual C++ DLL 的方式不受支持。需要修改您的应用程序,以使用清单生成。有关更多信息,请参见产品文档中的主题“作为共享的并行程序集的 Visual C++ 库”。

引起C运行时错误R6034的原因和解决方法

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

根据对应文章按如下方法修改,成功解决此问题(我的修改主要是第二步将Manifest内嵌到exe成功):

1. 在项目的“属性页”对话中,可以控制生成特定项目的清单文件。在“配置属性”选项卡上,单击“链接器”(Linker),再单击“清单文件”(Manifest File),然后单击“生成清单”(Generate Manifest)。默认情况下,新项目的项目属性会设置为生成清单文件。但是,通过使用项目的“生成清单”属性,也可以禁用项目清单的生成。当将此属性设置为“是”时,将生成该项目的清单。否则,当链接器解析应用程序代码间的依赖关系时,将忽略程序集信息,且不会生成清单。

2. Visual Studio 中的生成系统允许将清单嵌入最终的二进制应用程序文件中,或生成为外部文件。此行为由“项目属性”对话中的“嵌入清单”选项控制。若要对此属性进行设置,请打开“清单工具”节点,然后选择“输入和输出”。如果不嵌入清单,则它将被生成为外部文件,并保存在最终的二进制文件所在的目录中。如果嵌入清单,则 Visual Studio 将使用以下过程嵌入最终清单:

(1)将源代码编译为对象文件后,链接器将收集依赖程序集信息。在链接最终二进制文件时,链接器会生成一个中间清单,稍后该清单将用于生成最终清单。

(2)生成中间清单并完成链接后,将执行清单工具以合并成一个最终清单,并将它另存为外部文件。

(3)然后,项目生成系统将进行检测,确定在由清单工具生成的清单中,其信息是否有别于已嵌入二进制文件中的清单所包含的信息。

(4)如果二进制文件中嵌入的清单不同于清单工具生成的清单,或二进制文件中不包含嵌入的清单,则 Visual Studio 将再次调用链接器,将外部清单文件作为资源嵌入到二进制文件中。

(5)如果二进制文件中嵌入的清单与清单工具生成的清单相同,则生成系统将继续下面的生成步骤。

清单会作为文本资源嵌入到最终二进制文件中,您可通过在 Visual Studio 中将最终二进制文件作为文件打开来查看该清单。


Refered to:
C 运行时错误 R6034
http://msdn.microsoft.com/zh-cn/library/ms235560(v=VS.80).aspx
Visual Studio 中的清单生成
http://msdn.microsoft.com/zh-cn/library/ms235229(v=vs.80).aspx

 

 

[2012-12-20]

引起C运行时错误R6034的原因和解决方法

今天,再次遇到这个问题,而并非上面问题引起,而是所依赖的编译环境导致。我创建的一个dll,好像也是

在depends中查看依赖项是发现crt依赖库是ctr80的,而我使用vs2008编译的,应该是90。怀疑应该是manifest
少了dependency依赖。通过学习引用中“理解 Visual C++ 应用程序的依赖项”,了解到:这与“项目属性”的 C/C++ 分支中的“代码生成”选项卡上“运行时库”选择有关,愿选择为MTD,改为“多线程调试 DLL (/MDd)”),Release的是MD,编译出的manifest自动加入了这一依赖如下:


 
   
     
       

http://msdn.microsoft.com/zh-cn/library/ms235265(v=vs.80).aspx

0 0
原创粉丝点击