3

我知道有一些类似的问题,但我不认为他们真的有和我一样的要求。

我们的 DLL 是使用 Visual Studio 2005 编译的,并且由于安装限制,必须与特定版本的 CRT 链接。这是绝对的,用最新版本重新编译它不是解决方案。

我们最近更新了 Boost 库。但是,当我构建 Boost 时,它会自动使用最新的 CRT。现在,当我将 Boost 与我们的程序链接时,它会创建对 CRT 的最新(错误)版本和旧(正确)版本的 CRT 的依赖。对最新版本的依赖需要消失。

这个问题的最佳解决方案是什么?目前,我能想到的最好的方法是使用旧版本重建 Boost,但我不知道如何在不修改源代码的情况下轻松做到这一点。

如果有办法强制 Visual Studio 全局使用特定版本的 CRT(而不是基于每个项目),那就太好了。或者只是简单地删除最新版本的 CRT 的方法,但我很确定这是不可能的,因为我认为它被认为是操作系统的一部分。

4

3 回答 3

5

AFAIK,不建议使用不同版本的 CRT。与可以从 .NET 2.0 dll 引用 .NET 1.1 dll 的 .NET 不同,非托管不提供这种灵活性。

由于您无法升级 dll 以使用较新的 CRT,因此您唯一能做的就是在 VS2005 中重建 Boost。

此外,不建议链接不同 CRT 的两个 dll。它可能导致内存损坏等问题。

注意:每个 Visual Studio 都有其所有 dll 引用的默认 CRT 版本。

我也不明白“删除新的 CRT”。你需要为你使用的每个版本的 Visual Studio 安装 Visual Studio Redist。(该 redist 包含 CRT dll) http://msdn.microsoft.com/en-us/library/abx4dbyh%28VS.80%29.aspx

于 2010-03-08T17:00:31.390 回答
3

该解决方案是手动修改嵌入式清单以消除对最新 CRT 的依赖,因为它是使用动态链接的 CRT 构建的。不过,我质疑这样做的安全性。

出于某种原因,在 Boost 构建过程中强制包含一个 targetsxs 文件并没有强制它以指定的 CRT 为目标。

于 2010-03-09T15:41:32.413 回答
0

您必须准确找到 boost 项目中的哪个构造注入了对错误 CRT 的依赖关系并删除/修改该构造。它可能是 .vcproj 文件或一些清单或类似的东西。

VC++ 2005 和 VC++ 2008 CRT 包含或多或少相同的原语 - 您可能可以使用 VC++ 2005 完全重新编译 boost 或对其稍作调整并在此之后重新编译。是的,这需要一些努力,但这是唯一的方法 - 您的代码和 boost 代码都必须针对您要使用的 CRT 版本进行编译。

于 2010-03-09T15:48:55.967 回答