gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:39:19 31 4
gpt4 key购买 nike

在 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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com