configurar - ¿WindowsSdkDir no está configurado correctamente en Visual Studio 2008?
install codelens visual studio 2017 community (5)
Estoy intentando generar un código C ++ que requiere los archivos y las bibliotecas de encabezado del SDK de Windows 7.0 Mis directorios de VC ++ están configurados para:
$(VCInstallDir)include
$(VCInstallDir)atlmfc/include
$(WindowsSdkDir)/include
$(WindowsSdkDir)/common/include
$(FrameworkSDKDir)include
Mi variable $(WindowsSdkDir)
debe configurarse en C:/Program Files/Microsoft SDKs/Windows/v7.0/
- He utilizado la herramienta de configuración "Registro de Visual Studio" del SDK para configurarlo, y se ve correcta en el registro. He comprobado en HKLM/SOFTWARE/Microsoft/Microsoft SDKs/Windows
(y lo mismo en Wow6432Node
.
A pesar de esto, Visual C ++ todavía está recogiendo archivos de encabezado de C:/Program Files/Microsoft SDKs/Windows/v6.0A/
¿Qué está mal, y cómo lo arreglo?
Ah Encontré esta publicación del blog: http://blogs.msdn.com/windowssdk/archive/2008/06/30/winsdk-bug-notification-sdk-config-tool-appears-to-work-but-fails.aspx
Esencialmente, la herramienta de configuración solo actualiza la configuración HKEY_LOCAL_MACHINE; Visual Studio usa la configuración HKEY_CURRENT_USER en preferencia.
Encontré este mismo problema y encontré una solución que parece mejor que hackear el registro ...
"Abra cualquier proyecto y cambie el Conjunto de herramientas de plataforma a Windows7.1SDK y compílelo. Después de esto, la macro $ (WindowsSdkDir) cambia para todos los proyectos a v7.1 independientemente del Conjunto de herramientas de plataforma seleccionado".
Funciono para mi
Sólo tienes que seguir el siguiente resumen:
inicio-> ejecutar-> escriba: regedit ahora vaya a: HKEY_LOCAL_MACHINE -> SOFTWARE-> Wow6432Node -> Microsoft -> Microsoft SDKs-> Windows -> v8.0
Ahora, en el panel derecho, haga clic con el botón derecho y Nuevo valor de cadena como WindowsSDKDir. Como su valor se escribe en:
C: / Archivos de programa / Kits de Windows / 8.0 /
Eso es todo, ahora construye tu solución de nuevo. NB versión 8.0 es mía, allí encontrarás la tuya.
Si la entrada del blog no funciona. Intente ejecutar el vsvars32.bat en su <VS installdir>/Common7/Tools/vsvars32.bat
directorio de instalación de <VS installdir>/Common7/Tools/vsvars32.bat
y luego ejecute devenv.exe (en el mismo entorno).
Tuve muchos errores de vinculador en Visual Studio 2008 Express que sospeché que estaban relacionados con los problemas que se trataron en esta pregunta y en esta . Después de mucho investigar, logré solucionar el problema y pensé que sería útil compartir el conocimiento.
En resumen (a continuación doy más detalles):
los errores del vinculador ocurrían porque el valor de
%WindowsSdkDir%
no se estaba configurando correctamente y, por lo tanto, VS no pudo encontrar archivos comokernel32.lib
,la razón para la configuración incorrecta fue frustrantemente simple: un espacio se había deslizado en la variable
PATH
justo al frente de la entrada%SystemRoot%/system32
,esto significaba que el comando MSDOS de
reg query
había deshabilitado efectivamente,este comando se usa en uno de los archivos por lotes de VS para establecer valores de variables; por lo tanto, el archivo de proceso por lotes terminó configurando
%WindowsSdkDir%
no desde el registro (todas las entradas de mi registro fueron correctas), pero en su lugar lo configuraron para igualar su valor predeterminado de%VCINSTALLDIR%/PlatformSDK/
que no era correcto para mi configuración.
Obviamente, la solución fue fácil en mi caso: ¡eliminar el espacio! Pero, por supuesto, es la ruta a la solución lo que realmente es lo interesante ...
Como dije, el primer síntoma del problema fue que VS estaba cometiendo errores de enlace desagradables. Pude entender de ellos que VS no pudo encontrar archivos como kernel32.lib
.
Si busca alrededor de esto, es probable que se encuentre en esta pregunta SO . La respuesta que se encuentra actualmente con la mayoría de los votos menciona a WindowsSdkDir
, y sugiere que el interrogador verifique que se haga referencia correctamente en la configuración de VS.
Me quedó claro que mi configuración de VS no era el problema porque ya había podido completar mi instalación sin errores en otra máquina. Más búsquedas en ''WindowsSdkDir'' me llevaron a esta pregunta SO aquí, y verifiqué todas las entradas de registro que se sugieren (aquí y en otros lugares):
-
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Microsoft SDKs/Windows
-
HKEY_CURRENT_USER/SOFTWARE/Microsoft/Microsoft SDKs/Windows
-
HKEY_LOCAL_MACHINE/SOFTWARE/Wow6342Node/Microsoft/Microsoft SDKs/Windows
-
HKEY_CURRENT_USER/SOFTWARE/Wow6342Node/Microsoft/Microsoft SDKs/Windows
Todos estos se establecieron correctamente: el valor en el registro del valor de CurrentInstallFolder
siempre fue C:/Program Files/Microsoft SDKs/Windows/v6.0A/
. No %WindowsSdkDir%
entender por qué la variable %WindowsSdkDir%
se estaba configurando con un valor diferente.
Sin embargo, más búsquedas me llevaron a lugares como this y me sentí listo para entender cómo se establece la variable %WindowsSdkDir%
.
Mi mejor comprensión del proceso es:
El archivo
C:/Program Files (x86)/Microsoft Visual Studio 9.0/VC/vcvarsall.bat
es uno de los primeros scripts en ejecutarse. (Por cierto, haz clic derecho yEdit
para ver su contenido). No fue difícil calcular que se ejecutó lacall "%~dp0bin/vcvars32.bat"
líneacall "%~dp0bin/vcvars32.bat"
.El
%~dp0bin/
se interpreta como ''el directoriobin
en el directorio actual'', y por lo tanto, el siguiente lugar para ir está allí.En ese directorio
bin
hay elvcvars32.bat
esperado, y contiene solo un comando:"%VS90COMNTOOLS%vsvars32.bat"
.Para ver qué significa
%VS90COMNTOOLS%
, puede abrir el símbolo del sistema de Visual Studio (que se encuentra en el menú Inicio en la sección VS) e ingresarecho %VS90COMNTOOLS%
. Para mí, se expande aC:/Program Files (x86)/Microsoft Visual Studio 9.0/Common7/Tools
.Así que me encuentro en el archivo
C:/Program Files (x86)/Microsoft Visual Studio 9.0/Common7/Tools/vcvars32.bat
. Este archivo tiene algo de contenido real, y pude reconocer que el comando@call :GetWindowsSdkDir
es donde ocurre la acción.Esa función se define en este mismo archivo, unas líneas más abajo:
:GetWindowsSdkDir @call :GetWindowsSdkDirHelper HKLM > nul 2>&1 @if errorlevel 1 call :GetWindowsSdkDirHelper HKCU > nul 2>&1 @if errorlevel 1 set WindowsSdkDir=%VCINSTALLDIR%/PlatformSDK/ @exit /B 0
Esta función obviamente depende de una segunda función en ese mismo archivo:
:GetWindowsSdkDirHelper @for /F "tokens=1,2*" %%i in (''reg query "%1/SOFTWARE/Microsoft/Microsoft SDKs/Windows" /v "CurrentInstallFolder"'') DO ( if "%%i"=="CurrentInstallFolder" ( SET "WindowsSdkDir=%%k" ) ) @if "%WindowsSdkDir%"=="" exit /B 1 @exit /B 0
Ya casi hemos llegado. Pude ver cómo se accede realmente a los valores de registro con el comando de reg query
, y fue una buena suposición que el comando estaba devolviendo errores y cayendo a la configuración predeterminada.
Cuando intenté llamar a la reg query
en un MSDOS cmd
vainilla, recibí un mensaje que no fue reconocido. Naturalmente, ve a la variable PATH
en este punto, y ahí me encontré con ese pequeño espacio desagradable en la entrada C:/windows/system32/
. El espacio había sido colocado allí por accidente en una edición anterior, ¡eso sí!
Posdata
En el proceso de escribir esta respuesta, me topé con this respuesta SO, que explica cómo la fuente del problema es la variable PATH
. Solo para que quede constancia, esa respuesta de SO realmente apunta a una publicación de blog here
Puede ver la definición de la función :GetWindowsSdkDir
que busca en el registro los valores HKLM
primero y, si no los encuentra, los valores HKCU
. Esto me sugiere que Visual Studio 2008 Express no usa las entradas de registro en las ramas de Wow6432Node
.