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

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

本文关键字:链接 简单 程序 c++ 编译 工具 Visual Studio 命令行 2015      更新时间:2023-10-16

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

考虑main.cpp:

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

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

C:Usersbkirchersrctest>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:Usersbkirchersrctest>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

我知道微软发布C运行时作为一个新的Windows操作系统组件,通用CRT。

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

$(UniversalCRT_IncludePath)
$(UniversalCRT_LibraryPath_x64)

尽管如此,我如何得到适当的库和包括路径构建系统以外的devdev或MSBuild?

For the sake of it:

C:Program Files (x86)Microsoft Visual Studio 14.0VC>set include
INCLUDE=C:Program Files (x86)Microsoft Visual Studio 14.0VCINCLUDE;C:Program Files (x86)Microsoft Visual Studio 14.0VCATLMFCINCLUDE;C:Program Files (x86)Windows Kits10includewdfucrt;C:Program Files (x86)Windows KitsNETFXSDK4.6includeum;C:Program Files (x86)Windows Kits10includewdfshared;C:Program Files (x86)Windows Kits10includewdfum;C:Program Files (x86)Windows Kits10includewdfwinrt;
C:Program Files (x86)Microsoft Visual Studio 14.0VC>set lib
LIB=C:Program Files (x86)Microsoft Visual Studio 14.0VCLIBamd64;C:Program Files (x86)Microsoft Visual Studio 14.0VCATLMFCLIBamd64;C:Program Files (x86)Windows Kits10libwdfucrtx64;C:Program Files (x86)Windows KitsNETFXSDK4.6libumx64;C:Program Files (x86)Windows Kits10libwdfumx64;
LIBPATH=C:WindowsMicrosoft.NETFramework64v4.0.30319;C:Program Files (x86)Microsoft Visual Studio 14.0VCLIBamd64;C:Program Files (x86)Microsoft Visual Studio 14.0VCATLMFCLIBamd64;C:Program Files (x86)Windows Kits10UnionMetadata;C:Program Files (x86)Windows Kits10References;C:Program Files (x86)Windows Kits10ReferencesWindows.Foundation.UniversalApiContract1.0.0.0;C:Program Files (x86)Windows Kits10ReferencesWindows.Foundation.FoundationContract1.0.0.0;C:Program Files (x86)Windows Kits10Referencesindows.Networking.Connectivity.WwanContract1.0.0.0;C:Program Files (x86)Microsoft SDKsWindows Kits10ExtensionSDKsMicrosoft.VCLibs14.0ReferencesCommonConfigurationneutral;

包含环境变量的内容是个好主意。根据出现在那里的路径,似乎你已经安装了Windows驱动程序工具包,并且你在连接上遇到了这个问题。

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

C:Program Files (x86)Windows Kits10includewdfucrt
INCLUDE变量中的

,您应该使用类似于

的内容
C:Program Files (x86)Windows Kits10include10.0.10150.0ucrt

地毯式轰炸的解决方案:卸载WDK,确保wdf目录消失,一切应该恢复正常。


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

"C:Program Files (x86)Microsoft Visual Studio 14.0Common7Toolsvcvarsqueryregistry.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批处理文件(我怀疑它,但是…),那么它们将不再正常工作;在这种情况下,要为每个构建环境选择合适的批处理文件,还需要更多的操作。