无法使用 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 每个构建环境的正确批处理文件。
使用 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 每个构建环境的正确批处理文件。