2015-10-01 18 views
7

Con Visual Studio 2015 non sono più in grado di compilare e collegare un semplice programma C++ utilizzando gli strumenti della riga di comando.Impossibile compilare e collegare un semplice programma C++ con gli strumenti della riga di comando di Visual Studio 2015

consideri main.cpp:

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

Nelle versioni precedenti (ad esempio Visual Studio 2012) ho avuto modo di compilare e collegare facilmente 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 

e fatto.

Con Visual Studio 2015 tuttavia, non ho più corretta CRT includono e percorsi di libreria set:

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 

Capisco che Microsoft distribuisce il runtime C come nuovo componente del sistema operativo Windows, il CRT Universale.

Come descritto nella Introducing the Universal CRT, dovrei usare seguenti proprietà MSBuild per trovare i percorsi appropriati

$(UniversalCRT_IncludePath) 
$(UniversalCRT_LibraryPath_x64) 

Nonostante ciò, come faccio ad ottenere una corretta biblioteca e percorsi di inclusione per i sistemi di compilazione diversi devenv o MSBuild?

Per il gusto di farlo:

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; 

risposta

8

compreso il contenuto delle variabili di ambiente è stata una buona idea. Sulla base dei percorsi che appaiono lì, sembra che il kit di driver di Windows sia installato e stai riscontrando questo issue reported on Connect.

In base alla descrizione del problema, la directory wdf creata da WDK confonde il file batch che tenta di determinare le ultime versioni di SDK disponibili. Ad esempio, invece di

C:\Program Files (x86)\Windows Kits\10\include\wdf\ucrt 

nella variabile INCLUDE, si dovrebbe avere qualcosa di simile

C:\Program Files (x86)\Windows Kits\10\include\10.0.10150.0\ucrt 

La soluzione "bombardamento a tappeto": disinstallare il WDK, assicurarsi che le wdf directory sono andato, e le cose dovrebbero tornare alla normalità.


Se questo non è un'opzione, ecco una soluzione "chirurgica": è necessario modificare

"C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools\vcvarsqueryregistry.bat" 

(copia di backup prima, ovviamente)

1. cercare i seguenti due etichette:

:GetWindowsSdkDirHelper32 
:GetWindowsSdkDirHelper64 

Sotto ognuna di esse, troverete la seguente riga:

@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\ 

modificarla in:

@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. Cerca le seguenti due etichette:

:GetUniversalCRTSdkDirHelper32 
:GetUniversalCRTSdkDirHelper64 

Sotto ciascuno di essi, modificare la riga seguente:

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

a:

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

Questo è tutto. Fammi sapere se ha aiutato.

Ricordare che questo salterà del tutto le directory wdf. Se gli script di installazione del prompt dei comandi WDK capita di utilizzare lo stesso file batch vcvarsqueryregistry.bat (ne dubito, ma ...), allora non funzioneranno più correttamente; in questo caso sarà necessario un po 'più di hacking per selezionare il file batch appropriato per ogni ambiente di costruzione.

+0

Grazie per il collegamento e le soluzioni fornite. La tua analisi era corretta. Ho disinstallato Windows SDK e Windows Driver Kit e tutto funziona come un fascino ancora –

+3

'Fammi sapere se è stato utile. Grazie, ha aiutato a disinstallare WDK. – RIscRIpt

+2

Nota anche la soluzione alternativa pubblicata sul sito Microsoft collegato nella risposta sopra. Rendendo nascosta la cartella wdf risolve anche questo problema. – patthoyts