With Visual Studio 2015 I am no longer able to compile and link a simple C++ program using the command line tools.
通过Visual Studio 2015,我不再能够使用命令行工具来编译和链接一个简单的c++程序。
Consider main.cpp:
考虑main.cpp:
#include <stdlib.h>
int main() { return 0; }
In previous releases (for example Visual Studio 2012) I was able to compile and link main.cpp easily:
在以前的版本(例如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
And done.
和完成。
With Visual Studio 2015 however, I no longer have proper CRT include and library paths set:
然而,在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
I understand that Microsoft distributes the C runtime as a new Windows operating system component, the Universal CRT.
我知道微软将C运行时作为一个新的Windows操作系统组件,通用的CRT。
As described in Introducing the Universal CRT, I should use following MSBuild properties to find the appropriate paths
正如在介绍通用CRT时所描述的,我应该使用MSBuild属性来找到合适的路径。
$(UniversalCRT_IncludePath)
$(UniversalCRT_LibraryPath_x64)
Despite that, how do I get proper library and include paths for build systems other than devenv or MSBuild?
尽管如此,我如何获得正确的库,并包含除devenv或MSBuild之外的构建系统的路径?
For the sake of it:
为了它:
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;
1 个解决方案
#1
8
Including the contents of the environment variables was a good idea. Based on the paths appearing there, it seems that you have the Windows Driver Kit installed and you're encountering this issue reported on Connect.
包括环境变量的内容是个好主意。根据出现在那里的路径,似乎您已经安装了Windows驱动程序工具包,并遇到了有关Connect的报告。
According to the description of the issue, the wdf
directory created by the WDK confuses the batch file that tries to determine the latest SDK versions available. For example, instead of
根据问题的描述,WDK创建的wdf目录混淆了尝试确定最新SDK版本的批处理文件。例如,而不是
C:\Program Files (x86)\Windows Kits\10\include\wdf\ucrt
in the INCLUDE
variable, you should have something like
在INCLUDE变量中,应该有类似的东西。
C:\Program Files (x86)\Windows Kits\10\include\10.0.10150.0\ucrt
The "carpet-bombing" solution: uninstall the WDK, make sure the wdf
directories are gone, and things should return to normal.
“carpet-轰炸”解决方案:卸载WDK,确保wdf目录消失,一切恢复正常。
If that's not an option, here's a "surgical" solution: you need to edit
如果这不是一个选项,这里有一个“手术”解决方案:你需要编辑。
"C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools\vcvarsqueryregistry.bat"
(back it up first, of course)
(当然,首先要支持它)
1. Look for the following two labels:
1。寻找以下两个标签:
:GetWindowsSdkDirHelper32
:GetWindowsSdkDirHelper64
Under each of them, you'll find the following line:
在他们每个人的下面,你会发现下面一行:
@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\
Change it to:
把它改成:
@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. Look for the following two labels:
2。寻找以下两个标签:
:GetUniversalCRTSdkDirHelper32
:GetUniversalCRTSdkDirHelper64
Under each of them, change the following line:
在每一项下,更改以下一行:
@FOR /F "delims=" %%i IN ('dir "%UniversalCRTSdkDir%include\" /b /ad-h /on') DO @SET UCRTVersion=%%i
to:
:
@FOR /F "delims=" %%i IN ('dir "%UniversalCRTSdkDir%include\" /b /ad-h /on') DO (
@if not "%%i"=="wdf" (
@SET UCRTVersion=%%i
)
)
That's it. Let me know if it helped.
就是这样。如果有帮助,请告诉我。
Keep in mind that this will skip the wdf
directories altogether. If the WDK command prompt setup scripts happen to use the same vcvarsqueryregistry.bat
batch file (I doubt it, but...), then they won't work correctly anymore; a bit more hacking will be needed in this case to select the proper batch file for each build environment.
请记住,这将完全跳过wdf目录。如果WDK命令提示符设置脚本碰巧使用相同的vcvarsqueryregistry。bat批处理文件(我怀疑它,但是…),然后它们就不能正常工作了;在这种情况下,需要更多的黑客来为每个构建环境选择适当的批处理文件。
#1
8
Including the contents of the environment variables was a good idea. Based on the paths appearing there, it seems that you have the Windows Driver Kit installed and you're encountering this issue reported on Connect.
包括环境变量的内容是个好主意。根据出现在那里的路径,似乎您已经安装了Windows驱动程序工具包,并遇到了有关Connect的报告。
According to the description of the issue, the wdf
directory created by the WDK confuses the batch file that tries to determine the latest SDK versions available. For example, instead of
根据问题的描述,WDK创建的wdf目录混淆了尝试确定最新SDK版本的批处理文件。例如,而不是
C:\Program Files (x86)\Windows Kits\10\include\wdf\ucrt
in the INCLUDE
variable, you should have something like
在INCLUDE变量中,应该有类似的东西。
C:\Program Files (x86)\Windows Kits\10\include\10.0.10150.0\ucrt
The "carpet-bombing" solution: uninstall the WDK, make sure the wdf
directories are gone, and things should return to normal.
“carpet-轰炸”解决方案:卸载WDK,确保wdf目录消失,一切恢复正常。
If that's not an option, here's a "surgical" solution: you need to edit
如果这不是一个选项,这里有一个“手术”解决方案:你需要编辑。
"C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools\vcvarsqueryregistry.bat"
(back it up first, of course)
(当然,首先要支持它)
1. Look for the following two labels:
1。寻找以下两个标签:
:GetWindowsSdkDirHelper32
:GetWindowsSdkDirHelper64
Under each of them, you'll find the following line:
在他们每个人的下面,你会发现下面一行:
@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\
Change it to:
把它改成:
@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. Look for the following two labels:
2。寻找以下两个标签:
:GetUniversalCRTSdkDirHelper32
:GetUniversalCRTSdkDirHelper64
Under each of them, change the following line:
在每一项下,更改以下一行:
@FOR /F "delims=" %%i IN ('dir "%UniversalCRTSdkDir%include\" /b /ad-h /on') DO @SET UCRTVersion=%%i
to:
:
@FOR /F "delims=" %%i IN ('dir "%UniversalCRTSdkDir%include\" /b /ad-h /on') DO (
@if not "%%i"=="wdf" (
@SET UCRTVersion=%%i
)
)
That's it. Let me know if it helped.
就是这样。如果有帮助,请告诉我。
Keep in mind that this will skip the wdf
directories altogether. If the WDK command prompt setup scripts happen to use the same vcvarsqueryregistry.bat
batch file (I doubt it, but...), then they won't work correctly anymore; a bit more hacking will be needed in this case to select the proper batch file for each build environment.
请记住,这将完全跳过wdf目录。如果WDK命令提示符设置脚本碰巧使用相同的vcvarsqueryregistry。bat批处理文件(我怀疑它,但是…),然后它们就不能正常工作了;在这种情况下,需要更多的黑客来为每个构建环境选择适当的批处理文件。