4

我最近在一台新机器上安装了 VS2008,现在发现它不会与旧机器上构建的 DLL 链接,给出错误 LNK2001:未解析的外部符号 __forceCRTManifestCUR。我认为这与 Side-By-Side 的问题有关。

经过一番研究,我现在怀疑问题在于旧的 VS2008 安装升级到版本 9.0.30729.4462 QFE,而新的 VS2008 安装在 9.0.21022.8 RTM 上。

在进一步研究中,我读到我需要将 SQL Server 2008 至少安装到 SP1 才能将 VS2008 升级到更高版本。然而,我在新机器上安装了 SQL Server 2008,它现在是 SR3,但 VS2008 仍然在版本 9.0.21022.8 上。我怀疑我安装的 SQL Server 是预先服务打包到 SR2 的,这可能是问题所在。

Windows (Microsoft) 更新显示 SQL Server 2008 或 Visual Studio 2008 没有挂起的更新。

请问您能否建议一种强制 Visual Studio 升级到 9.0.30729.4462 QFE 版本的方法?

或者,是否有任何其他不涉及重新编译我所有预编译的 DLL 的问题的解决方案?

4

3 回答 3

2

我知道,一个迟到的回复,以及更多的后代,但我在两台机器上安装 VS 2008 之间存在类似的差异。一个报告版本“9.0.30729.1 SP”,另一个报告版本“9.0.30729.4462 QFE”。我希望它们是一样的,并且知道第一个已经安装了服务包。

这篇文章启发了我尝试首先安装 SQL 2008 R2,结果证明这是关键。在此之后,两个 VS 版本都是“.4462 QFE”。

于 2015-05-11T11:35:21.997 回答
1

哎呀-看起来我完全被微软误导了。

原来是 Visual Studio Service Pack 1 将版本从 9.0.21022 更新到 9.0.30729。

我确信我已经安装了 SP1,因为:

a) About 对话框明确提到了 SP1(尽管结果是 .Net 3.5 SP1 而不是 Visual Studio 2008 SP1)

b) Windows Update 不提供 SP1 供下载,所有“检查更新”链接都指向一个指示您使用 Windows Update 的页面。

在我最初的问题之后,我设法通过安装 VS2008 的 C++ 功能包来构建我的源代码库,但由于并排错误,什么都不会运行。最终我想到可能没有安装 SP1。

于 2012-06-26T14:46:50.077 回答
1

然而 VS2008 仍在版本 9.0.21022.8

事实并非如此,当您安装修补程序/服务包/安全补丁时,您的#includes 和 CRT 库实际上确实升级到了 9.0.30729.4462。

打开 vc/include/crtassem.h 可以看到宏汤。重要的是编译代码时生效的 _BIND_TO_CURRENT_CRT_VERSION 宏值。设置为 0 时,您将声明对 CRT 的原始 RTM 版本 (9.0.21022.8) 的依赖关系。当你在安装了发布者策略并重定向到更高版本的 CRT 的机器上运行时,微软没有在 CRT 中进行任何会破坏你的代码的更改。

将其设置为 1,您将声明对您实际测试代码的 CRT 版本的依赖关系,即安装在您的开发机器上的版本。这是更明智的做法。尽管微软在确保 CRT 的服务补丁不会破坏任何东西方面遇到了一些麻烦,但我从未听说过发生这种情况的案例。

链接器警告试图笨拙地告诉您的是,您正在尝试将使用 _BIND_TO_CURRENT_CRT_VERSION 设置为 0 编译的代码与设置为 1 编译的代码链接。这当然没有意义,您可以不能两全其美。

修复编译器设置,对于您链接的所有代码,它们必须相同。

于 2012-06-26T10:52:07.220 回答