[英]Unable to compile and link simple C++ program with Visual Studio 2015 command line tools
使用Visual Studio 2015,我无法再使用命令行工具编译和链接简单的C ++程序。
考虑main.cpp:
#include <stdlib.h>
int main() { return 0; }
在以前的版本中(例如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
并做了。
但是,在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操作系统组件Universal CRT。
如介绍通用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\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;
包括环境变量的内容是个好主意。 根据出现的路径,您似乎已安装Windows驱动程序工具包,并且您遇到Connect上报告的此问题 。
根据问题的描述,WDK创建的wdf
目录会混淆尝试确定最新SDK版本的批处理文件。 例如,而不是
C:\Program Files (x86)\Windows Kits\10\include\wdf\ucrt
在
INCLUDE
变量中,你应该有类似的东西
C:\Program Files (x86)\Windows Kits\10\include\10.0.10150.0\ucrt
“地毯式轰炸”解决方案:卸载WDK,确保
wdf
目录消失,事情应该恢复正常。
如果这不是一个选项,这是一个“外科”解决方案:你需要编辑
"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
批处理文件(我怀疑它,但是......),那么它们将不再正常工作; 在这种情况下,需要更多的黑客攻击来为每个构建环境选择合适的批处理文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.