解决多个CRT问题

3
我知道有几个类似的问题,但我认为它们并不真正具有与我的要求相同的要求。
我们的DLL是使用Visual Studio 2005编译的,并且由于安装限制,必须链接到特定版本的CRT。这是绝对的,重新编译最新版本并不是解决方案。
我们最近更新了Boost库。然而,在我构建Boost时,它自动使用了最新的CRT。现在,当我将Boost与我们的程序链接时,它会创建对最新(错误)版本和旧(正确)版本CRT的依赖关系。需要去掉对最新版本的依赖。
这个问题的最佳解决方案是什么?目前,我能想到的最好的方法是使用旧版本重新构建Boost,但我不知道如何在不修改源代码的情况下轻松完成。
如果有一种方式可以强制Visual Studio全局使用特定版本的CRT(而不是每个项目),那就太好了。或者一种简单地删除最新版本CRT的方法,但我相信这不可能,因为我认为它被视为操作系统的一部分。
3个回答

5
据我所知,不建议使用不同版本的CRT。与.NET不同的是,在.NET 2.0 dll中引用.NET 1.1 dll是可行的,但是Unmanaged并没有提供这种灵活性。
由于不能升级dll以使用较新的CRT,您唯一能做的就是在VS2005中重建Boost。
此外,不建议链接两个使用不同CRT的dll。这可能会导致内存损坏等问题。
注意:每个Visual Studio都有其默认CRT版本,所有dll都会引用它。
另外,我不理解“删除新的CRT”。您需要为每个使用的Visual Studio版本安装Visual Studio Redist。(该redist包含CRT dll) http://msdn.microsoft.com/en-us/library/abx4dbyh%28VS.80%29.aspx

“No each”这一行读起来不太对,应该把“No”改成“注意”吗? - Andrew O'Reilly
我们只使用Visual Studio 2005进行构建。区别在于CRT的一个版本来自最新的服务包,而另一个(正确的)版本来自较旧的服务包。我们更希望Visual Studio始终使用旧版本。 - Collin Dauphinee
Visual Studio 2005到目前为止有两个版本。1. 'RTM' 2. 'SP1'。每个CRT的小版本都会有所不同。但是,如果您在同一台机器上(同一款Visual Studio)构建项目和Boost,则两者都将链接到相同的CRT。因此,您不会遇到链接到不同CRT版本的任何问题。始终首选使用最新的SP构建Visual Studio,因为SP是出于某种原因发布的。 - Ganesh R.

3
解决方案是手动修改嵌入式清单以删除对最新CRT的依赖,因为它是使用动态链接的CRT构建的。不过我对此的安全性表示质疑。
由于某种原因,在Boost构建过程中强制包含targetxs文件并未强制其针对指定的CRT。

0

你必须准确地找到 Boost 项目中注入错误 CRT 依赖的结构,并删除/修改该结构。这可能是 .vcproj 文件中的某些清单或类似的东西。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接