如何构建针对特定Visual C ++ Redistributable版本的Visual C ++项目

时间:2012-06-18 15:54:03

标签: c++ visual-c++ visual-studio-2005 msvcrt

我有一个C ++本机库,我正在使用Visual Studio 2005构建,它是大型项目的一部分。

这个项目通常包含其他几个dll,包括Microft C ++ Redistributable Package库(例如msvcr80.dll)。这样我们就可以部署我们的项目,而无需让用户安装Microsoft Visual C ++ Redistributable Package 2005。

问题在于每当我将我的库放入这个更大的项目时,我都会收到以下错误:

This application has failed to start because the application configuration is incorrect. Reinstalling application may fix this problem.

为了解决这个问题,我查看了我的dll使用的Visual Studio CRT版本以及较大项目使用的版本,结果发现它们不同。

以下是较大项目的清单:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <noInheritable></noInheritable>
    <assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.4053" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
</assembly>

这是我从我的图书馆得到的:

<dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.6195" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
</dependency>

然后我在网上做了一些研究,发现至少有两种方法可以手动更改我的dll的CRT版本。

第一个是在我的项目中设置以下宏:

#define _CRT_ASSEMBLY_VERSION "8.0.50727.4053"

第二个详细说明post

我已经尝试了两种方法,但都没有效果。

至于第一个,我已经将_CRT_ASSEMBLY_VERSION添加到我项目的一个头文件中,但它没有改变它的CRT版本。另外,如果我有多个项目,我是否必须将这个宏添加到所有项目中?

至于第二个,我把我的图书馆的清单改为:

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
    <dependency>
        <dependentAssembly>
            <assemblyIdentity type='win32' name='Microsoft.VC80.CRT' version='8.0.50727.4053' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
        </dependentAssembly>
    </dependency>
</assembly>

但现在我的库正在生成,里面没有标签。

最后请注意,我非常喜欢我是否可以使用第一种方法,因为它更简单并且可以直接进入代码,这样我就不必记住为我的项目维护一个单独的清单文件

1 个答案:

答案 0 :(得分:0)

  

然而,这是一个高度控制的环境

问题是,该机器尚未收到CRT的最新安全更新。如果该机器也是安装程序的创建者,那么你肯定会遇到你描述的问题,你要求的是机器上没有的DLL版本。

将文件部署到已知安全问题的用户计算机上绝对是一种需要审核的策略。定义_CRT_ASSEMBLY_VERSION宏是正确的方法,但是请考虑在项目设置中而不是源文件中设置该宏,这样您就可以完全确定在vc / include / crtassem.h获取#included之前设置它。项目+属性,C / C ++,预处理器,预处理器定义设置。

是的,肯定在所有你的项目上。