[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. 获取本地文件
有几种方法可以实现这一目标:
-
他们可能已经在场了。如果 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其中),我也有这些文件
-
下载并安装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.
-
获取文件来自[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示例,可能需要检查:
我将与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]>
-
将文件复制到VStudio's Include dir(根据一些人的指示URL问题中的 s)
这不起作用OOTB,较新的VStudio版本不再有通用的“包含”dir,但他们宁愿“将此任务委托给”子组件(并且dir)称为Tools
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]>
-
添加文件位置(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]>
-
创建一个包装器VCVarsAll并称其为
包装器将:
(in any顺序),但我不打算透露更多细节
Summary
最简单的步骤顺序(只需要一次)让事情顺利进行:
-
获取文件来自[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)
-
(绿色)按钮(组合框)代码 -> 下载 ZIP
-
将下载的存档内容解压到文件夹中。我们来参考一下${MS71SDK} (每当在命令中看到时,请将其替换为实际路径)。这些文件将位于${MS71SDK}\包括
-
将他们的位置添加到%包括% 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%)
-
正常构建。NMake将接受更改
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)