【问题标题】:How to buid a Visual C++ project targeted to a specific Visual C++ Redistributable version如何构建针对特定 Visual C++ Redistributable 版本的 Visual C++ 项目
【发布时间】:2012-06-18 15:54:02
【问题描述】:

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

该项目通常包含其他几个 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>

但是现在我的库正在生成,其中没有标签。

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

【问题讨论】:

  • 您安装了 2005 SP1 吗?更大的项目在哪里建造呢?
  • 一定要用2005吗?
  • 嗨,是的,我的机器上确实安装了 2005 SP1。我还考虑在构建主要大型项目的同一台机器上构建我的项目,但是这是一个高度受控的环境,我不可能在那里安装我的项目所需的依赖项。所以,就目前而言,我必须让一切都在我目前的机器上运行。
  • @SRK,是的,不幸的是我被 Visual Studio 2005 困住了。
  • 您是否尝试过重建您的顶级项目?我隐约记得它修复了上面的选项 #2。

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


【解决方案1】:

但这是一个高度受控的环境

问题出在哪里,那台机器没有收到 CRT 的最新安全更新。如果该机器也是安装程序的发起者,那么您肯定会遇到您所描述的问题,您要求的是该机器上不可用的 DLL 版本。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 2017-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多