CMake无法打开"ucrtd.lib"。

10

我的问题类似于此:使用CMake为VS 2017生成解决方案时出现问题,但该解决方案对我无效。

VS 2017的开发人员命令提示符中运行cmake时,我收到错误消息(来自CMakeError.log):

LINK:致命错误 LNK1104: 无法打开文件“ucrtd.lib” [E:\Projects\My Project\VS\CMakeFiles\3.14.4\CompilerIdC\CompilerIdC.vcxproj]

但是,文件ucrtd.lib位于Windows Kits文件夹中。

echo %LIB%

D:\Program Files (x86)\Microsoft Visual Studio 2017 Community\VC\Tools\MSVC\14.16.27023\lib\x86;C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6.1\lib\um\x86;C:\Program Files (x86)\Windows Kits\10\lib\10.0.17763.0\ucrt\x86;C:\Program Files(x86)\Windows Kits\10\lib\10.0.17763.0\um\x86;

dir "C:\Program Files (x86)\Windows Kits\10\lib\10.0.17763.0\ucrt\x86\" /w /b

libucrt.lib
libucrtd.lib
ucrt.lib
ucrtd.lib

我还尝试手动运行CMakeError.log中列出的构建命令,它成功了,没有错误。

看起来CMake没有识别环境变量,或者我错过了一些重要的步骤?CMake版本为3.14.4,Visual Studio版本为15.9.7。

你是否尝试明确告诉CMake针对你安装的特定版本的Windows进行目标设置:-DCMAKE_SYSTEM_VERSION=10.0.17763.0?请参见此处的帖子(https://gitlab.kitware.com/cmake/cmake/issues/17730)。 - Kevin
太好了!已将此添加为答案。上述帖子显示,CMake会检查某些注册表值以获取“Windows Kits”根文件夹,并且如果安装了多个VS版本,则可能首先找到错误的版本。 - Kevin
3个回答

18

tl;dr:

确保 HKLM\Software\Microsoft\Windows Kits\Installed Roots@KitsRoot10 设置为:

C:\Program Files (x86)\Windows Kits\10\

而不是:

C:\Program Files\Windows Kits\10\

详细解释

在 LNK1104 错误页面上,有一个相关的部分标题为“已更新的 Windows SDK 库”,其中写道:

当 Visual Studio 路径到 Windows SDK 过时时,会出现此错误。如果您独立于 Visual Studio 安装程序安装了更新的 Windows SDK,则可能会发生这种情况。要在 IDE 中修复它,请更新VC++ Directories 属性页中指定的路径。将路径中的版本设置为与新 SDK 匹配。如果使用开发人员命令提示符,请使用初始化环境变量的批处理文件来更新新 SDK 路径。使用 Visual Studio 安装程序安装更新的 SDK 可以避免此问题。

鉴于此,合理的做法似乎是验证指向包含 ucrt 库文件的路径的“宏”是否在使用中。

enter image description here

但是,这可能还不够。该宏可能是错误的。

enter image description here

来自 Microsoft 工程师的此消息表示,一些旧的 Windows Kits 不正确地设置了 ucrt 的路径。在这些工具包中,他们使用 64 位程序文件路径(“Program Files”)而不是 32 位路径(“Program Files (x86)”)。然而,在安装期间,如果已经设置了路径,则不会由后续的 Windows SDK 安装程序更新。

因此,您的系统可能会将环境变量定义为错误值,导致 Visual Studio 无法找到相关库。

在这种情况下,Microsoft 工程师的建议是要么更新有问题的注册表值,要么删除它,然后重新安装 Windows SDK。

嘿,亚历山大,
我已经和Windows SDK团队讨论过这个问题。总的来说,套件安装程序不应该将'HKEY_LOCAL_MACHINE\Software\Microsoft\Windows Kits\Installed Roots@KitsRoot10'设置为'C:\Program Files\Windows Kits\10',它应该永远指向'C:\Program Files (x86)\Windows Kits\10'。然而,有些套件会犯这个错误,如果注册表键已经存在于任何套件安装之前,则永远不会更新。我相信你在那个系统上安装的第一个windows套件有这个问题。
话虽如此,这些问题永远不会完全消失,因为始终会有具有此问题的套件和机器。我通过首先检查Wow6432Node版本(历史上没有出现过这个问题)来更新ucrt.props以更具防御性,并且仅在不存在该版本时才回退到通常的注册表键。
这个修复将在下一个发布的Windows 10 SDK中出现。在此期间,我建议删除该注册表键并重新安装Windows 10 SDK,或者直接修改'HKEY_LOCAL_MACHINE\Software\Microsoft\Windows Kits\Installed Roots@KitsRoot10'以指向'C:\Program Files (x86)\Windows Kits\10'(与删除注册表键并重新安装相同的效果,但更少出错)。
希望对你有所帮助!
Steve Wishnousky 高级软件工程师 - Visual C++ Libraries stwish@microsoft.com

11
根据 这里的描述,如果你在使用 VS2022,并且已安装的 Windows SDK 版本为 10.0.19041.0(这是默认随 VS2022 安装的版本),则可能会遇到此问题。
在这种情况下,解决方法是卸载该 SDK 版本并安装另一个版本。

非常感谢!!!我一整天都在尝试做这个! - AzlanCoding

6

正如在这篇CMake论坛中提到的那样,可能需要明确告诉CMake您安装了哪个具体的Windows版本。假设您已安装版本10.0.17763.0,包括以下定义将指向该版本:

cmake -DCMAKE_SYSTEM_VERSION=10.0.17763.0

这里是关于 CMAKE_SYSTEM_VERSION文档

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