如何构建面向特定可视C++可再发行版本的视觉C++项目

How to buid a Visual C++ project targeted to a specific Visual C++ Redistributable version

本文关键字:C++ 可视 再发行 版本 项目 视觉 何构建 构建      更新时间:2023-10-16

我有一个C++原生库,我正在使用Visual Studio 2005构建它,这是一个更大项目的一部分。

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

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

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

为了解决这个问题,我已经查看了我的dll正在使用哪个版本的Visual Studio CRT,以及较大的项目正在使用哪个版本的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"

第二个在这篇文章中有详细说明。

我尝试了这两种方法,但都没有奏效。

至于第一个,我已将_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>

但是现在我的库是在没有标签的情况下生成的。

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

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

这就是问题所在,该计算机尚未收到 CRT 的最新安全更新。 如果该计算机也是安装程序的创建者,那么您肯定会遇到您所描述的问题,您正在请求计算机上不可用的DLL版本。

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

是的,当然在你的所有项目中。