2010-03-08 58 views
3

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

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

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

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

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

回答

3

将该溶液手工修改嵌入式清单,以除去在最新CRT的依赖性,因为它与CRT动态链接的建立。不过,我质疑这一点的安全性。

由于某些原因,在Boost构建过程中强制包含targetsxs文件并未强制它将目标指定为CRT。

5

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

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

此外,不建议连接两个不同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

+0

开始“不是每个”的行不完全正确,如果“否”是“注意”? – 2010-03-08 17:40:45

+0

我们只使用Visual Studio 2005进行构建。区别在于CRT的一个版本来自最新的Service Pack,另一个(正确)版本来自较早的Service Pack。我们希望Visual Studio _always_使用旧版本。 – 2010-03-08 17:59:02

+0

Visual Studio 2005有两个版本,直到日期。 1.'RTM'2.'SP1'。每个CRT的小版本都会有所不同。但是,如果您在同一台计算机上(同一Visual Studio)同时构建项目和Boost,则两者都将链接到相同的CRT。因此,您不会遇到任何链接到不同CRT版本的问题。总是倾向于使用最新的SP针对Visual Studio构建,因为SP是有理由发布的。 – 2010-03-09 11:32:30

0

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

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