visual-studio-2008 - 如何分发 C 运行时 (CRT) 库

标签 visual-studio-2008 dependencies

在 Visual C++ 2008 express 上转换 VC++ 6 工作区后,我正在构建一个应用程序。构建本身成功,但我遇到的真正问题是生成的 list 如下所示:

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level='asInvoker' uiAccess='false' />
      </requestedPrivileges>
    </security>
  </trustInfo>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.30729.1' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
    </dependentAssembly>
  </dependency>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
    </dependentAssembly>
  </dependency>
</assembly>

我的问题是:

如何将 list 限制为仅列出一个版本,最好是 9.0.21022.8。这样我就可以在我的应用程序中捆绑必要的 C-Run 时依赖项?

我知道这个问题的可能根本原因是依赖于使用 9.0.21022.8 的某些库,而我的 VC++ Express 2008 可能正在使用 9.0.30729.1。这就是为什么两者都被列为依赖项。

笔记:

我正在遵循 http://www.codeproject.com/Tips/211756/How-to-Distribute-C-run-time-CRT-Libraries-with-Yo?display=Print 的方法 b)其中谈到在应用程序文件夹中复制 CRT DLL 文件和 Microsoft.VCXX.CRT.manifest 文件。

最佳答案

Visual Studio 2008 的默认设置是绑定(bind)到版本 9.0.21022.8。这与您安装的任何版本的服务包或修补程序无关,因为对 Visual Studio 的更新不一定会强制您的应用程序必须升级(如 here 所述)。

其他可能的版本是 Service Pack 1 的 9.0.30729.1 或 9.0.30729.6161对于带有安全更新的 SP1。还有其他的。

由于默认行为,您的应用程序可能正在使用 9.0.21022.8,并且有一个已编译为使用 9.0.30729.1 的库。您可以使用以下命令行 (described here) 找出每个库所依赖的版本:

dumpbin /directives <name>.lib

为了control the version您的应用程序绑定(bind)到的运行时,您可以在项目设置中定义预处理器符号(必须在项目设置中或在命令行中)以绑定(bind)到默认版本(9.0.21022.8 - 通过不定义它们)或绑定(bind)到同版本作为您安装的 Visual Studio:
_BIND_TO_CURRENT_VCLIBS_VERSION=1

显然,您还可以使用 this answer 中的定义指定要绑定(bind)到的确切版本。 (也许我应该在输入所有这些之前先找到它:)。

如果您发现是您的应用程序绑定(bind)到 9.0.30729.1 并且依赖库绑定(bind)到 9.0.21022.8,那么您只需删除预处理器定义。

另一个困难是,当您升级 Visual Studio 时,可再发行文件夹中的运行时合并模块也会升级到这些版本。因此,如果您有一个使用这些合并模块的安装项目,并且您尝试绑定(bind)到默认版本,您最终将安装新版本的运行时。

如果您还分发运行时策略合并模块,则解析运行时版本将不是问题,因为库加载器将在运行时查看您的运行时策略并自动加载最新版本,即使您绑定(bind)到默认版本也是如此。即使是私有(private)程序集,加载程序 will first look in the WinSxS folder因此,如果有政策,您将绑定(bind)到最新版本。因此, list 中的混合版本号都将重定向到最新版本。

有时这是不希望的,您可以控制它以强制它仅加载您指定的 list 中的版本,这在对 this similar SO question 的回答中进行了解释。 .

关于visual-studio-2008 - 如何分发 C 运行时 (CRT) 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8097733/

相关文章:

c++ - 检查静态库/可执行文件的依赖关系

visual-studio - VS2008 "Get everything..."选项无法解释的结果

package - 如何声明可以由许多不同命名的包之一实现的依赖项?

visual-studio - 具有大量项目的 Visual Studio 解决方案

java - 61 classes.jar 中有重复的类,classes.jar 位于何处?

c++ - Visual Studio 可以在 C++ 头文件中为我管理函数原型(prototype)吗?

visual-studio-2008 - "Attach to Process"作为构建后事件

.net - 如何以编程方式启动 visual studio 并将其发送到特定文件/行?

mysql - 表的 RDBM 规范化

c# - 在 C# 中从程序集及其依赖项创建实例