解决多个CRT问题

时间:2010-03-08 16:44:59

标签: c visual-studio boost dependencies msvcrt

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

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

我们最近更新了Boost库。但是,当我构建Boost时,它会自动使用最新的CRT。现在,当我将Boost与我们的程序联系起来时,它会对CRT的最新(错误)版本和CRT的旧(正确)版本产生依赖关系。需要依赖最新版本。

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

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

3 个答案:

答案 0 :(得分:5)

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

由于你无法升级你的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

答案 1 :(得分:3)

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

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

答案 2 :(得分:0)

你必须确切地找到boost项目中的哪个构造注入了对错误CRT的依赖并删除/修改该构造。它可能是.vcproj文件中的某些内容或某些清单或类似内容。

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