从Developer Command提示符中检测<sdkddkver.h>和<winapifamily.h>的可用性?

时间:2016-11-13 18:40:17

标签: visual-studio winapi sdk header-files nmake

我们有一个Nmake-based makefile来帮助在Visual Studio下进行测试,包括Visual Studio .Net / 2002到Visual Studio 2015.makefile includes the following

CXXFLAGS = /nologo /W4 /wd4511 /D_MBCS /Zi /TP /GR /EHsc /MD /FI sdkddkver.h /FI winapifamily.h
LDFLAGS = /nologo /SUBSYSTEM:CONSOLE
ARFLAGS = /nologo
LDLIBS =

它在后来的Visual Studios中很有用,比如2015 Developer Command提示符,因为SDK中始终提供<sdkddkver.h><winapifamily.h>。在Windows 7上的Visual Studio 2008或Windows Vista上的Visual Studio 2005下进行测试并不是那么顺利:

> nmake /f cryptest.nmake

cl.exe /nologo /D_MBCS /Zi /TP /GR /EHsc /MD /FI sdkddkver.h /FI winapifamily.h /Yc"pch.h" /Fp"pch.pch" /c pch.cpp
pch.cpp
pch.cpp : fatal error C1083: Cannot open include file: 'winapifamily.h': No such
 file or directory
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 9.0\
VC\BIN\cl.exe"' : return code '0x2'
Stop.

我们希望根据<sdkddkver.h><winapifamily.h>的可用性来保护强制包含。我使用set和Nmake的环境nmake -p检查了环境,但没有任何内容向我跳出来。

我们如何检测Visual Studio Developer命令提示符中何时可以使用<sdkddkver.h><winapifamily.h>

这是 Platform defined macros for windows store app之前的步骤。我认为以下是相似或相关的问题,但他们假设我们试图检测的文件已经存在:

在VS2015下测试时,我知道的两次尝试:

# Both WindowsSdkDir and WindowsSdkVersion are defined in environment
!IF "$(WindowsSdkDir)" != "" || "$(WindowsSdkVersion)" != ""
CXXFLAGS = $(CXXFLAGS) /FI sdkddkver.h
!ENDIF

!IF EXIST(sdkddkver.h)
CXXFLAGS = $(CXXFLAGS) /FI sdkddkver.h
!ENDIF

1 个答案:

答案 0 :(得分:0)

我想我可以为<sdkddkver.h>提供部分答案。我没有<winapifamily.h>的解决方案,可以给人很大的信心。

  

以下两次尝试我知道在测试时不起作用   VS2015:

# Both WindowsSdkDir and WindowsSdkVersion are defined in environment
!IF "$(WindowsSdkDir)" != "" || "$(WindowsSdkVersion)" != ""
CXXFLAGS = $(CXXFLAGS) /FI sdkddkver.h
!ENDIF

当环境变量作为Nmake宏可用时,它会变为大写,因此以下工作符合预期:

!IF "$(WINDOWSSDKDIR)" != "" || "$(WINDOWSSDKLIBVERSION)" != ""
CXXFLAGS = $(CXXFLAGS) /FI sdkddkver.h
!ENDIF

以下是<winapifamily.h>的部分解决方案。它适用于Windows Phone 8和Windows 10.但是它在安装了Visual Studio和SDK的Windows 8周围有一个死区。死区是无法确定<winapifamily.h>是否可用:

!IF "$(WINDOWSPHONEKITDIR)" != "" || "$(UNIVERSALCRTSDKDIR)" != "" || "$(UCRTVERSION)" != ""
CXXFLAGS = $(CXXFLAGS) /FI winapifamily.h
!ENDIF