无法使用 Visual Studio 2015 命令行工具编译和 link 简单的 C++ 程序

Unable to compile and link simple C++ program with Visual Studio 2015 command line tools

使用 Visual Studio 2015 我不再能够使用命令行工具编译和 link 一个简单的 C++ 程序。

考虑 main.cpp:

#include <stdlib.h>
int main() { return 0; }

在以前的版本中(例如 Visual Studio 2012)我能够轻松编译 link main.cpp:

C:\Users\bkircher\src\test>cl main.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 17.00.61030 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

main.cpp
Microsoft (R) Incremental Linker Version 11.00.61030.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:main.exe
main.obj

完成。

然而,对于 Visual Studio 2015,我不再设置正确的 CRT 包含和库路径:

C:\Users\bkircher\src\test>cl main.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23026 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

main.cpp
main.cpp(1): fatal error C1083: Cannot open include file: 'stdlib.h': No such file or directory

我了解到 Microsoft 将 C 运行时作为新的 Windows 操作系统组件(通用 CRT)分发。

Introducing the Universal CRT 中所述,我应该使用以下 MSBuild 属性来找到合适的路径

$(UniversalCRT_IncludePath)
$(UniversalCRT_LibraryPath_x64)

尽管如此,我如何获得正确的库并包含 devenv 或 MSBuild 以外的构建系统的路径?

为了它:

C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC>set include
INCLUDE=C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE;C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\ATLMFC\INCLUDE;C:\Program Files (x86)\Windows Kits\include\wdf\ucrt;C:\Program Files (x86)\Windows Kits\NETFXSDK.6\include\um;C:\Program Files (x86)\Windows Kits\include\wdf\shared;C:\Program Files (x86)\Windows Kits\include\wdf\um;C:\Program Files (x86)\Windows Kits\include\wdf\winrt;

C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC>set lib
LIB=C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\LIB\amd64;C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\ATLMFC\LIB\amd64;C:\Program Files (x86)\Windows Kits\lib\wdf\ucrt\x64;C:\Program Files (x86)\Windows Kits\NETFXSDK.6\lib\um\x64;C:\Program Files (x86)\Windows Kits\lib\wdf\um\x64;
LIBPATH=C:\Windows\Microsoft.NET\Framework64\v4.0.30319;C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\LIB\amd64;C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\ATLMFC\LIB\amd64;C:\Program Files (x86)\Windows Kits\UnionMetadata;C:\Program Files (x86)\Windows Kits\References;C:\Program Files (x86)\Windows Kits\References\Windows.Foundation.UniversalApiContract.0.0.0;C:\Program Files (x86)\Windows Kits\References\Windows.Foundation.FoundationContract.0.0.0;C:\Program Files (x86)\Windows Kits\References\indows.Networking.Connectivity.WwanContract.0.0.0;C:\Program Files (x86)\Microsoft SDKs\Windows Kits\ExtensionSDKs\Microsoft.VCLibs.0\References\CommonConfiguration\neutral;

包括环境变量的内容是个好主意。根据那里出现的路径,您似乎安装了 Windows 驱动程序套件,并且遇到了 issue reported on Connect.

根据问题的描述,WDK 创建的 wdf 目录混淆了试图确定可用的最新 SDK 版本的批处理文件。例如,而不是

C:\Program Files (x86)\Windows Kits\include\wdf\ucrt

INCLUDE 变量中,你应该有类似

的东西
C:\Program Files (x86)\Windows Kits\include.0.10150.0\ucrt

"carpet-bombing"解决方法:卸载WDK,确保wdf目录没有了,应该return就正常了。


如果这不是一个选项,这里有一个 "surgical" 解决方案:您需要编辑

"C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools\vcvarsqueryregistry.bat"

(当然要先备份)

1.寻找下面两个标签:

:GetWindowsSdkDirHelper32
:GetWindowsSdkDirHelper64

在每个选项下,您会找到以下行:

@REM Get windows 10 sdk version number
@if not "%WindowsSdkDir%"=="" @FOR /F "delims=" %%i IN ('dir "%WindowsSdkDir%include\" /b /ad-h /on') DO @set WindowsSDKVersion=%%i\

改为:

@REM Get windows 10 sdk version number
@if not "%WindowsSdkDir%"=="" @FOR /F "delims=" %%i IN ('dir "%WindowsSdkDir%include\" /b /ad-h /on') DO (
   @if not "%%i"=="wdf" (
      @set WindowsSDKVersion=%%i\
   )
)

2.寻找下面两个标签:

:GetUniversalCRTSdkDirHelper32
:GetUniversalCRTSdkDirHelper64

在每一项下,更改以下行:

@FOR /F "delims=" %%i IN ('dir "%UniversalCRTSdkDir%include\" /b /ad-h /on') DO @SET UCRTVersion=%%i

至:

@FOR /F "delims=" %%i IN ('dir "%UniversalCRTSdkDir%include\" /b /ad-h /on') DO (
   @if not "%%i"=="wdf" (
      @SET UCRTVersion=%%i
   )
)

就是这样。如果有帮助,请告诉我。

请记住,这将完全跳过 wdf 目录。如果 WDK 命令提示设置脚本碰巧使用相同的 vcvarsqueryregistry.bat 批处理文件(我对此表示怀疑,但是...),那么它们将无法再正常工作;在这种情况下,需要更多的黑客攻击才能 select 每个构建环境的正确批处理文件。