CMake 无法打开“ucrtd.lib”

shi*_*ngo 10 cmake visual-studio

我的问题与此类似:Problems generated Solution for VS 2017 with CMake,但该解决方案对我不起作用。

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

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

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

回显%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;

目录“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,它成功了,没有错误。

CL.exe /c /nologo /W0 /WX- /diagnostics:classic /Od /Oy- /D _MBCS /Gm- /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:内联 /Fo"Debug\" /Fd"Debug\vc141.pdb" /Gd /TC /analyze- /FC /errorReport:queue CMakeCCompilerId.c

link.exe /ERRORREPORT:QUEUE /OUT:".\CompilerIdC.exe" /INCRMENTAL:NO /NOLOGO kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /MANIFEST /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /manifest:embed /PDB:".\CompilerIdC.pdb" /SUBSYSTEM:CONSOLE /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:".\CompilerIdC.lib" /MACHINE:X86 /SAFESEH 调试\CMakeCCompilerId.obj

所以看来 cmake 无法识别环境变量,或者我是否错过了一些重要步骤?

cmake版本是3.14.4
Visual Studio版本是15.9.7

Ech*_*ynx 20

长话短说:

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

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

并不是:

C:\Program Files\Windows 工具包\10\

完整说明

在 LNK1104 错误页面上,有一个标题为“更新的 Windows SDK 库”的相关部分,内容如下:

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

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

在此输入图像描述

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

在此输入图像描述

这条信息表示,某些较旧的 Windows 套件未正确设置 ucrt 的路径。在这些套件中,它们使用 64 位程序文件路径(“Program Files”)而不是 32 位路径(“Program Files (x86)”)。但是,在安装过程中,如果已经设置了路径,则后续的 Windows SDK 安装程序将不会更新该路径。

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

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

嘿亚历山大,

我已与 Windows SDK 团队讨论过此事。一般来说,套件安装程序不应将“HKLM\Software\Microsoft\Windows Kits\Installed Roots@KitsRoot10”设置为 C:\Program Files\Windows Kits\10,它始终应指向 C:\Program Files ( x86)\Windows 套件\10。但是,有些套件会犯此错误,并且如果注册表项在安装任何套件之前就已存在,则永远不会更新该注册表项。我相信无论您在该系统上安装的哪个 Windows 套件首先都会遇到此问题。

也就是说,这些问题永远不会完全消失,因为总会有套件和机器出现此问题。我已经更新了 ucrt.props,通过首先检查 Wow6432Node 版本(历史上没有出现过此问题)来对此更具防御性,并且只有在该版本不存在时才回退到通常的注册表项。

此修复将出现在下一个发布的 Windows 10 SDK 中。同时,我建议删除该注册表项并重新安装 Windows 10 SDK,或者直接修改 HKLM\Software\Microsoft\Windows Kits\Installed Roots@KitsRoot10 以指向 C:\Program Files (x86)\Windows Kits\ 10(与删除注册表项并重新安装的效果相同,但不易出错)。

希望这可以帮助!

Steve Wishnousky 高级软件工程师 - Visual C++ 库 stwish@microsoft.com

(此处引用是因为担心链接中消息的长期可用性)


小智 11

如此处所述,如果您使用的是 VS2022 并且安装的 Windows SDK 版本为 10.0.19041.0(这是在撰写本文时随 VS2022 默认安装的版本),那么您可能遇到过这种情况。

在这种情况下,解决方案是卸载该 SDK 版本并安装其他版本。


squ*_*les 6

正如本CMake 论坛中提到的,可能有必要明确告诉 CMake 您安装了哪个特定的 Windows 版本。考虑到您已经安装了版本10.0.17763.0,包括以下定义会将 CMake 定向到该版本:

cmake -DCMAKE_SYSTEM_VERSION=10.0.17763.0
Run Code Online (Sandbox Code Playgroud)

这是的文档CMAKE_SYSTEM_VERSION