如何将在Visual Studio 2015中的C++项目更新为使用新的通用CRT?

15

在将我的项目升级到新的平台工具集v140后,VS2015构建失败,出现链接器错误:LNK1104无法打开文件“libucrt.lib”。

由于新的通用CRT,这个库似乎已经被移动,如本文所述:http://blogs.msdn.com/b/vcblog/archive/2015/03/03/introducing-the-universal-crt.aspx?PageIndex=2

虽然文章告诉我现在应该链接什么,但它没有提供说明。

我的解决方案生成一个.exe和一个.dll。我不知道该怎么处理下面这个矩阵:

Release DLLs (/MD ): msvcrt.lib vcruntime.lib ucrt.lib

Release Static (/MT ): libcmt.lib libvcruntime.lib libucrt.lib


这篇博客文章对我来说看起来很清晰。它提供了新库和查找它们的路径。当您“更新”项目时,您采取了哪些步骤? - Ryan Bemrose
我从“解决方案资源管理器”中选择了我的解决方案,然后“重新装备”(我相信这是术语),它会将每个项目重新映射到新的编译器上。接着,在配置属性中的“附加包含目录”中添加了 $(UniversalCRT_IncludePath)。 - Jesse Meyer
你是否也将 $(UniversalCRT_LibraryPath_*)(根据你的目标处理器而定)添加到链接设置中了? - Ryan Bemrose
2
你正在使用 Visual Studio 2015 RC 或 RTM 吗?我们在 RTM 中对目标进行了一些调整,以尝试减少目录更改的影响。如果您正在使用 Visual Studio 2015 RTM,是否愿意分享以下信息:[1] 您的 IncludePath 和 LibraryPath 在项目中是如何设置的,或者 [2] 您可以与我们分享整个项目文件吗?我们有兴趣了解哪些项目文件没有选取新的默认设置。(如果您愿意,您可以通过 james.mcnellis@microsoft.com 与我联系。) - James McNellis
James,如果步骤有变化,请编辑下面的答案以确保其正确性。 - Ryan Bemrose
显示剩余8条评论
4个回答

11

当你转换你的项目时,你需要确保更新包括文件和链接器设置,以指向新的 CRT。

对于包括文件,请添加以下内容:

$(UniversalCRT_IncludePath)

要添加链接,请根据目标处理器之一添加以下内容:

$(UniversalCRT_LibraryPath_x86)
$(UniversalCRT_LibraryPath_x64)
$(UniversalCRT_LibraryPath_arm)

这个解决方案对我很有帮助,因为我试图将旧的C++项目从VS2013移植到VS2017。谢谢! - Cary

3
内置变量$(LibraryPath)会解析为在Visual Studio中构建应用所需的所有库路径,包括VS 2015中的UCRT路径。
注意:您可能还希望更新包含路径,其可移植内置变量为:$(IncludePath)
或者更好的方法是,如果您不需要自定义库或包含路径,可以使用默认值(选择<inherit from parent or defaults>)。
注意2:您可以同时调整多个项目和多个目标的路径,只需选择多个项目,然后选择"属性"

3
我已经下载了SDK 10.0.10586.0,其中包含库libucrt.lib,位于C:\Program Files (x86)\Windows Kits\10\Lib\10.0.10586.0\ucrt\x64。但是我无法让链接器找到这个库,它使用10240(之前安装的版本)。
上面提到的宏$(LibraryPath)和$(UniversalCRT_LibraryPath_x64)都指向C:\Program Files (x86)\Windows Kits\10\lib\10.0.10240.0\ucrt\x64。我不知道如何更改这些宏的值,这可能是必要的,以便让链接器使用正确的库。
操作系统为Windows 7 Pro,64位,使用Visual Studio 2015更新1。链接静态库,C++和Intel Fortran项目。

1
我有同样的问题,宏指向的是比安装的版本旧的版本。我还没有找到可以更新的地方。 - Zitrax
3
好的,我找到了一个链接描述该如何操作:https://msdn.microsoft.com/en-us/library/mt186161.aspx。基本上,右键单击解决方案,选择“重新定向解决方案”,然后选择正确的SDK版本。 - Zitrax
你怎么知道库变量指向哪里?我没在任何地方看到这些定义,而且我的也不起作用。 - Ali

2

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