有关R6034错误的思考
作者:朱金灿
来源:http://blog.csdn.net/clever101
我们有时会遇到R6034错误,工程明明编译通过,但是运行时却出现:
网上的解决办法很多,但是有效的不多,特别是对阐述这个问题的本质的很少。今天就这个问题谈谈我的粗浅看法,不当及不全面地请大神们赐教。大家知道,操作系统是处在硬件和应用程序之间的一个中间层。应用程序运行时需要用到的库称为运行时库,运行时库相当于操作系统和应用程序之间的一个小的中间层。VC编出来的程序需要的运行时库成为VC运行时库,如MSVCR90.dll等。
其实微软提供的VC运行时库是有很多版本的。为什么需要这么多的运行时库?原因很多,主要有下面两个:一是为了不同的处理器厂商和硬件架构,比如amd和intel,比如x86和x64等等;二是为了适配不同VS版本,比如VS2003、VS2005、VS2008等等,即使同是VS2008,VS2008和VS2008+sp1的运行时库都是不一样的。如何保证开发者的VC程序链接的是正确的VC运行时库?微软就想了一个招,在编译VC程序时开发者可以生成一个清单文件,这个清单文件记录你实际需要链接的哪些版本的运行时库,然后这个清单文件可以嵌入到你的应用程序,当程序启动时根据这个清单文件去寻找你所需要的运行时库。
VS编译程序时可以选择是否生成和嵌入这个清单文件,具体编译选项如下图:
到这里就明白了为啥了会产生R6034的错误了,就是你的应用程序链接到了错误的运行时库,至于为什么链接到了错误的运行时库,原因是应用程序没有潜入清单文件,因为没有精确指定,系统就默认你链接的是system32下的vc运行时库。
因此要避免R3034的错误,最好是在编译程序时选择生成和嵌入这个清单文件。在Win7系统下,系统已经自带了很多版本的运行时库,具体位置在:C:\Windows\winsxs。在xp系统还没有自带多个版本的运行时库,所以一般需要安装注册VS运行时库。