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

Ben*_*her 7 c++ cmd crt visual-studio-2015

使用Visual Studio 2015,我无法再使用命令行工具编译和链接简单的C++程序.

考虑main.cpp:

#include <stdlib.h>
int main() { return 0; }
Run Code Online (Sandbox Code Playgroud)

在以前的版本中(例如Visual Studio 2012),我能够轻松地编译和链接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
Run Code Online (Sandbox Code Playgroud)

并做了.

但是,在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
Run Code Online (Sandbox Code Playgroud)

据我所知,Microsoft将C运行时分发为新的Windows操作系统组件Universal CRT.

如介绍通用CRT中所述,我应该使用以下MSBuild属性来查找适当的路径

$(UniversalCRT_IncludePath)
$(UniversalCRT_LibraryPath_x64)
Run Code Online (Sandbox Code Playgroud)

尽管如此,我如何获得适当的库并包含除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\10\include\wdf\ucrt;C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6\include\um;C:\Program Files (x86)\Windows Kits\10\include\wdf\shared;C:\Program Files (x86)\Windows Kits\10\include\wdf\um;C:\Program Files (x86)\Windows Kits\10\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\10\lib\wdf\ucrt\x64;C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6\lib\um\x64;C:\Program Files (x86)\Windows Kits\10\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\10\UnionMetadata;C:\Program Files (x86)\Windows Kits\10\References;C:\Program Files (x86)\Windows Kits\10\References\Windows.Foundation.UniversalApiContract\1.0.0.0;C:\Program Files (x86)\Windows Kits\10\References\Windows.Foundation.FoundationContract\1.0.0.0;C:\Program Files (x86)\Windows Kits\10\References\indows.Networking.Connectivity.WwanContract\1.0.0.0;C:\Program Files (x86)\Microsoft SDKs\Windows Kits\10\ExtensionSDKs\Microsoft.VCLibs\14.0\References\CommonConfiguration\neutral;
Run Code Online (Sandbox Code Playgroud)

bog*_*dan 8

包括环境变量的内容是个好主意.根据出现的路径,您似乎已安装Windows驱动程序工具包,并且您遇到Connect上报告的问题.

根据问题的描述,wdfWDK创建的目录会混淆尝试确定可用的最新SDK版本的批处理文件.例如,而不是

C:\Program Files (x86)\Windows Kits\10\include\wdf\ucrt
Run Code Online (Sandbox Code Playgroud)

INCLUDE变量中,你应该有类似的东西

C:\Program Files (x86)\Windows Kits\10\include\10.0.10150.0\ucrt
Run Code Online (Sandbox Code Playgroud)

"地毯式轰炸"解决方案:卸载WDK,确保wdf目录消失,事情应恢复正常.


如果这不是一个选项,这里是一个"外科"解决方案:你需要编辑

"C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools\vcvarsqueryregistry.bat"
Run Code Online (Sandbox Code Playgroud)

(当然首先备份)

1.查找以下两个标签:

:GetWindowsSdkDirHelper32
:GetWindowsSdkDirHelper64
Run Code Online (Sandbox Code Playgroud)

在每个下面,您将找到以下行:

@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\
Run Code Online (Sandbox Code Playgroud)

将其更改为:

@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\
   )
)
Run Code Online (Sandbox Code Playgroud)

2.查找以下两个标签:

:GetUniversalCRTSdkDirHelper32
:GetUniversalCRTSdkDirHelper64
Run Code Online (Sandbox Code Playgroud)

在每个下面,更改以下行:

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

至:

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

而已.如果有帮助,请告诉我.

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

  • "让我知道它是否有帮助.谢谢,它帮助没有卸载WDK. (3认同)
  • 另请注意在上述答案中链接的Microsoft站点上发布的变通方法.隐藏wdf文件夹也解决了这个问题. (2认同)