Visual Studio NMake 构建失败并显示:致命错误 U1052:未找到文件“win32.mak”

2023-12-22

[MS.Docs]:示例 Makefile https://learn.microsoft.com/en-us/cpp/build/reference/sample-makefile (for VStudio 2022 (17)在问题创建时)包含以下内容(生成文件.mak):

# Sample makefile

!include <win32.mak>

all: simple.exe challeng.exe

.c.obj:
  $(cc) $(cdebug) $(cflags) $(cvars) $*.c

simple.exe: simple.obj
  $(link) $(ldebug) $(conflags) -out:simple.exe simple.obj $(conlibs) lsapi32.lib

challeng.exe: challeng.obj md4c.obj
  $(link) $(ldebug) $(conflags) -out:challeng.exe $** $(conlibs) lsapi32.lib

这不起作用OOTB:

[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q073159159]> sopr.bat
### Set shorter prompt to better fit when pasted in StackOverflow (or other) pages ###

[prompt]> "c:\Install\pc032\Microsoft\VisualStudioCommunity\2019\VC\Auxiliary\Build\vcvarsall.bat" x64 > nul

[prompt]> nmake /f Makefile.mak

Microsoft (R) Program Maintenance Utility Version 14.29.30146.0
Copyright (C) Microsoft Corporation.  All rights reserved.

Makefile.mak(3) : fatal error U1052: file 'win32.mak' not found
Stop.

网络上的结果(特别是SO https://stackoverflow.com/)比我预期的要少得多:

  • [MS.MSDN.Social]:未找到 ntwin32.mak https://social.msdn.microsoft.com/Forums/vstudio/en-US/4db6024e-cb2c-4992-9fb8-4aeefc194733/ntwin32mak-not-found?forum=vssetup其中指出(提出修复方案):

    该文件包含在 v7.1 SDK 中。安装 v7.1 SDK 后,您可以在命令提示符处输入“set include=%include%;%programfiles(x86)% \Microsoft SDKs\Windows\v7.1A\”将其添加到“include”环境变量中包括'(不带引号)。

  • [MS.MSDN.Social]:如何在 VisualStudio2015 上使用 ntwin32.mak https://social.msdn.microsoft.com/Forums/en-US/7fe660bd-c3c2-442b-9e31-9493ae091d4b/howto-use-ntwin32mak-on-visualstudio2015?forum=visualstudiogeneral

    据我所知,从 Windows 8 SDK 开始,它包含 MSBuild,因此 makefile 被删除。

  • [Google.Groups]:找不到 Visual Studio 12.0 win32.mak https://groups.google.com/g/vim_dev/c/PeIoexPdleg

  • [MathWorks]:当我尝试在 Simulink 7.5 (R2010a) 中以加速器模式模拟模型时,为什么会收到致命错误“错误 U1052:未找到文件‘ntwin32.mak’”? https://www.mathworks.com/matlabcentral/answers/94469-why-do-i-receive-a-fatal-error-error-u1052-file-ntwin32-mak-not-found-when-i-try-to-simulate-my

  • [WireShark.OSQA-Ask]:找不到文件“win32.mak”停止。 https://osqa-ask.wireshark.org/questions/4725/file-win32mak-not-found-stop

  • [BetaArchive]:Microsoft KB Archive/133249 https://www.betaarchive.com/wiki/index.php/Microsoft_KB_Archive/133249(太老了,与此无关)

  • [SO]:为 live555 安装制作文件时出现文件“ntwin32.mak”未找到错误 https://stackoverflow.com/q/71370961/4788546

  • [SO]:nmake 无法使用 VS 2012 编译 TSF 示例 https://stackoverflow.com/q/11422308/4788546

  • [SO]: VS2010 到 VS2015 移植错误 https://stackoverflow.com/q/35594858/4788546


2 个文件(Win32.mak- 及其包装NtWin32.mak)是一部分适用于 Windows 7 和 .NET Framework 4 的 Microsoft Windows SDK.
这是SDK版本配对VStudio 2010 (10) and VStudio 2012 (11) 根据 (非官方) [维基百科]:微软Windows SDK https://en.wikipedia.org/wiki/Microsoft_Windows_SDK。由于某种原因,它们在较新的版本中已不再存在SDK版本。一个可能的原因(如其中一位所述URL问题中的 s)是MS令人鼓舞MSBuild usage.

为了使事情顺利进行,需要执行两个步骤。

1. 获取本地文件

有几种方法可以实现这一目标:

  1. 他们可能已经在场了。如果 2 中的任何一个VStudio安装了开头提到的版本,然后这个SDK版本很可能也会自动安装。既然两者VStudio版本是pc032 (032bit),那么SDK预计是pc032以及。因此,文件位置通常是:C:\ Program Files(x86)\ Microsoft SDKs \ Windows \ v7.1A \ Include.
    请注意,版本也可能是v7.0A,但我将使用前一个,因为它较新(并且这两个文件在这两个版本中是相同的)。

    Note: 既然我有9 种不同VStudio安装的版本 (v2010 and v2012其中),我也有这些文件

  2. 下载并安装SDK手动

    • [MS]:适用于 Windows 7 和 .NET Framework 4 的 Microsoft Windows SDK (ISO) https://www.microsoft.com/en-us/download/details.aspx?id=8442- 包含 3 个ISOs - 对于每个支持的平台(包括已退役的平台)IA64)

    • [MS]:适用于 Windows 7 和 .NET Framework 4 的 Microsoft Windows SDK https://www.microsoft.com/en-us/download/details.aspx?id=8279- 在线安装程序(很可能)下载并安装上一个项目中的项目之一

    Note: check [MS.Developer]:Windows SDK 和模拟器存档 https://developer.microsoft.com/en-us/windows/downloads/sdk-archive for SDK版本。

    安装(旧)版本可能会有点问题Win10+版本。例如,就我而言,在启动 (pc064)安装程序,我得到:

    由于我已经有了文件,因此没有进行安装程序。但这个话题讨论的是[MS.MSDN.Social]:Windows 10 上的 Windows SDK 7.1 https://social.msdn.microsoft.com/Forums/sqlserver/en-US/1de7c9b4-1feb-4c98-b426-f7f02cbafa99/windows-sdk-71-on-windows-10?forum=windowssdk.

  3. 获取文件来自[GitHub]:CristiFati/MSSDKFiles - (v7.1A_w10) 适用于 Windows 7 和 .NET Framework 4 的 Microsoft Windows SDK https://github.com/CristiFati/MSSDKFiles/tree/v7.1A_w10。由于上述两种方式都不是非常用户友好(更不用说安装需要行政人员权限),我将它们上传到这个存储库中,可以从那里下载它们(使用浏览器,Git, ...).
    Note:某些文件包含修改(以适应与较新版本相对应的(某些)宏值)Win版本:Win 8, Win 10, ...).

2. 将它们添加到NMake system

在上一节的末尾,这两个文件应该存在于本地某处。为了简单起见,我将使用作为测试文件:

生成文件.mak:

# Dummy Makefile

!include <win32.mak>

all:
    @echo Executing target: $@ ($(MAKEDIR))

用于构建Win示例,可能需要检查:

  • [SO]:如何构建 libjpeg 9b 的 DLL 版本? (@CristiFati 的回答) https://stackoverflow.com/a/44469099/4788546

  • [SO]:链接到 CRT(未解析的外部符号 WinMainCRTStartup)(@CristiFati 的回答) https://stackoverflow.com/a/71872682/4788546

我将与VStudio 2019(并重复使用相同的Cmd安慰):

[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q073159159]> sopr.bat
### Set shorter prompt to better fit when pasted in StackOverflow (or other) pages ###

[prompt]> "c:\Install\pc032\Microsoft\VisualStudioCommunity\2019\VC\Auxiliary\Build\vcvarsall.bat" x64 > nul

[prompt]> nmake /nologo /f Makefile.mak
Makefile.mak(3) : fatal error U1052: file 'win32.mak' not found
Stop.

[prompt]> echo %INCLUDE%
c:\Install\pc032\Microsoft\VisualStudioCommunity\2019\VC\Tools\MSVC\14.29.30133\ATLMFC\include;c:\Install\pc032\Microsoft\VisualStudioCommunity\2019\VC\Tools\MSVC\14.29.30133\include;C:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\include\um;C:\Program Files (x86)\Windows Kits\10\include\10.0.22000.0\ucrt;C:\Program Files (x86)\Windows Kits\10\include\10.0.22000.0\shared;C:\Program Files (x86)\Windows Kits\10\include\10.0.22000.0\um;C:\Program Files (x86)\Windows Kits\10\include\10.0.22000.0\winrt;C:\Program Files (x86)\Windows Kits\10\include\10.0.22000.0\cppwinrt

[prompt]>
  1. 将文件复制到VStudio's Include dir(根据一些人的指示URL问题中的 s)

    这不起作用OOTB,较新的VStudio版本不再有通用的“包含”dir,但他们宁愿“将此任务委托给”子组件(并且dir)称为Tools

    • 优点是只需要执行一次(每个VStudio版本和VStudio工具 version)

    • 缺点:除非你真的知道自己在做什么,否则不要这样做(在这种情况下required管理权限应该不是问题)。反复弄乱系统文件可能会成为一种习惯,并且很有可能在某个时刻覆盖(或删除)某些内容,从而损坏程序安装(甚至是OS)

    Example:

    [prompt]> :: @TODO - cfati: DON'T DO THIS! (Demo purposes only)
    [prompt]> echo %VCToolsInstallDir%
    c:\Install\pc032\Microsoft\VisualStudioCommunity\2019\VC\Tools\MSVC\14.29.30133\
    
    [prompt]> copy "e:\Work\Dev\GitHub\CristiFati\MSSDKFiles\src\Include\Win32.mak" "%VCToolsInstallDir%\include"
            1 file(s) copied.
    
    [prompt]> nmake /nologo /f Makefile.mak
    Executing target: all (e:\Work\Dev\StackOverflow\q073159159)
    
    [prompt]> :: Cleanup
    [prompt]> del /f "%VCToolsInstallDir%\include\Win32.mak"
    
    [prompt]> nmake /nologo /f Makefile.mak
    Makefile.mak(3) : fatal error U1052: file 'win32.mak' not found
    Stop.
    
    [prompt]>
    
  2. 添加文件位置(dir) to %包括% env var(另一种方式)

    if defined INCLUDE (set INCLUDE=%INCLUDE%;${Win32Mak_Directory}) else (set INCLUDE=${Win32Mak_Directory})
    

    ${Win32Mak_Directory}是实际路径的占位符.

    安全,它不会造成任何损害(至少不会造成永久性损害,可能发生的最糟糕的事情是破坏当前的环境)Cmd控制台,启动另一个可以修复它)。问题是每次需要构建时都必须执行此操作(在调用VCVarsAll),(如果经常发生)可能会变得烦人。要摆脱“猴子工作”,请更改(当前用户的)env vars (once)来自:

    • GUI (控制面板->系统和安全->高级系统设置 (系统dm.cpl) -> 系统属性->环境变量->新建)

      如果变量已经定义,则追加${Win32Mak_Directory}到现有值,用a分隔分号 (;)

    • CmdLine ([MS.Docs]:setx https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/setx)

      if defined INCLUDE (setx INCLUDE %INCLUDE%;${Win32Mak_Directory}) else (setx INCLUDE ${Win32Mak_Directory})
      if defined INCLUDE (set INCLUDE=%INCLUDE%;${Win32Mak_Directory}) else (set INCLUDE=${Win32Mak_Directory})
      

      Note: The if defined部分(这看起来很奇怪 - 而且有点太复杂)需要工作于Cmd (Win 10- 检查下面的行为):

      [prompt]> set _UNSET=
      
      [prompt]> echo %_UNSET% ??? WTH ???
      %_UNSET% ??? WTH ???
      

      When placed in a .bat file, everything is normal (only the contents in the 1st parentheses is enough)

    当然,可以选择直接从注册表执行此操作,但我不会坚持这样做。

    Example:

    [prompt]> set _INCLUDE=%INCLUDE%
    
    [prompt]> set INCLUDE=%INCLUDE%;e:\Work\Dev\GitHub\CristiFati\MSSDKFiles\src\Include
    
    [prompt]> nmake /nologo /f Makefile.mak
    Executing target: all (e:\Work\Dev\StackOverflow\q073159159)
    
    [prompt]> :: Cleanup
    [prompt]> set INCLUDE=%_INCLUDE%
    
    [prompt]> nmake /nologo /f Makefile.mak
    Makefile.mak(3) : fatal error U1052: file 'win32.mak' not found
    Stop.
    
    [prompt]>
    
  3. 创建一个包装器VCVarsAll并称其为

    包装器将:

    • Call VCVarsAll

    • 调整%包括% env var(检查上一项(#2.))

    (in any顺序),但我不打算透露更多细节



Summary

最简单的步骤顺序(只需要一次)让事情顺利进行:

  1. 获取文件来自[GitHub]:CristiFati/MSSDKFiles - (v7.1A_w10) 适用于 Windows 7 和 .NET Framework 4 的 Microsoft Windows SDK https://github.com/CristiFati/MSSDKFiles/tree/v7.1A_w10 (tag v7.1A_原版包含从以下位置获取的文件MS)

    1. (绿色)按钮(组合框)代码 -> 下载 ZIP

    2. 将下载的存档内容解压到文件夹中。我们来参考一下${MS71SDK} (每当在命令中看到时,请将其替换为实际路径)。这些文件将位于${MS71SDK}\包括

  2. 将他们的位置添加到%包括% env var (from Cmd)

    set MS71SDKINC=${MS71SDK}\Include
    if defined INCLUDE (setx INCLUDE %INCLUDE%;%MS71SDKINC%) else (setx INCLUDE %MS71SDKINC%)
    if defined INCLUDE (set INCLUDE=%INCLUDE%;%MS71SDKINC%) else (set INCLUDE=%MS71SDKINC%)
    
  3. 正常构建。NMake将接受更改

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Visual Studio NMake 构建失败并显示:致命错误 U1052:未找到文件“win32.mak” 的相关文章

随机推荐