web-dev-qa-db-fra.com

Que sont les kits Windows et comment fonctionnent-ils?

Dans les temps anciens lors du développement d'un projet C++ sur Windows dans Visual Studio, votre version de Visual Studio aurait sa propre version des bibliothèques C et C++, et votre projet faisait référence à une version spécifique du SDK Windows afin d'accéder aux en-têtes pour l'accès à la plate-forme Win32. Si plusieurs versions du SDK Windows étaient installées, un système complexe impliquant des variables d'environnement vous permettait de sélectionner la version du SDK Windows que Visual Studio utiliserait par défaut.

Ce n'était pas génial, et pour le faire fonctionner correctement, il a fallu creuser un peu, mais cela ne faisait que du travail.

Je viens de passer de VS2012 à VS2015 et il me semble que tout ce que ce système a remplacé est carrément cassé, ou je ne le comprends tout simplement pas.

  1. La mise à niveau d'une application console VS2012 C++ simple qui inclut conio.h vers VS2015 ne présente aucune erreur. Pourquoi? conio.h n'est plus dans les bibliothèques Visual Studio C/C++ et vit désormais dans Windows Kit 10, la mise à niveau du projet ne réinstalle pas le SDK utilisé (comme vous vous en doutez).

  2. En créant une toute nouvelle application Hello World C++ dans VS2015, le projet C++ inclut des répertoires héritant $ (VC_IncludePath) et $ (WindowsSDK_IncludePath). $ (WindowsSDK_IncludePath) extrait les en-têtes de C:\Program Files (x86)\Windows Kits\8.1 tandis que $ (VC_IncludePath) extrait les en-têtes de C:\Program Files (x86)\Windows Kits\10.

Les mises à niveau de projet simples échouent donc sans erreur signalée lors de la mise à niveau. Nettoyez les nouveaux projets de console en tirant simultanément les en-têtes de 2 installations différentes du Kit Windows, et j'ai maintenant des entrées pour 8.1 et 10 sous C:\Program Files (x86)\Microsoft SDK et C:\Program Files (x86)\Windows Kits. Windows Kit 8.1 contient des en-têtes Win32 et WinRt, tandis que Windows Kit 10 contient des en-têtes C/C++.

Ai-je une installation mal configurée et corrompue ou ce désordre est-il censé être?

Si ce gâchis est comme il est censé être, comment cela devrait-il fonctionner? J'ai essayé de rechercher des informations sur les kits Windows dans MSDN, mais je n'ai rien trouvé à part des informations sur le kit de pilotes Windows, qui était autrefois complètement différent, mais je ne sais pas si c'est toujours le cas.

Y a-t-il une documentation que j'ai manquée qui explique la raison d'être de cette configuration de bibliothèque et comment elle est destinée à être utilisée?

15
Neutrino

J'ai rencontré plusieurs fois différentes variantes de ce problème, avec des problèmes de résolution des fichiers d'en-tête et des dépendances de bibliothèque sur les projets mis à niveau de VS2012 à VS2015.

Le commentaire de Hans en réponse à ma question résout en effet le problème des en-têtes, mais après avoir rencontré le même problème pour les dépendances de bibliothèque, j'ai ce qui pourrait être une solution plus simple qui fonctionne également pour la résolution des dépendances de bibliothèque ayant échoué.

Lors de l'ouverture d'un projet VS2012 dans VS2015, aucune mise à niveau automatique n'est effectuée. L'ouverture des propriétés du projet et la modification de General -> Platform Toolset vers Visual Studio 2015 (v140) reproduira probablement une variante de l'erreur de résolution d'en-tête décrite dans ma question d'origine ou une erreur de résolution de dépendance de bibliothèque différente.

La manière la plus simple que j'ai trouvée pour résoudre ces problèmes est d'ouvrir les propriétés du projet et d'aller dans les répertoires VC++ -> Inclure les répertoires. Dans tous les chemins que vous avez ajoutés vous-même à votre projet, vous trouverez probablement $ (VCInstallDir)\include; $ (VCInstallDir\atlmfc\include; $ (WindowsSDK_IncludePath)

Cliquez sur le chemin pour afficher la liste déroulante et cliquez sur modifier, cela affichera une boîte de dialogue avec trois sections, de haut en bas, des chemins définis explicitement, des chemins évalués et des chemins hérités. Tout en bas se trouve une case à cocher 'Hériter des valeurs par défaut du parent ou du projet' que j'ai toujours trouvé non cochée au départ.

Dans les chemins d'inclusion définis explicitement, supprimez le $ (VCInstallDir)\include; $ (VCInstallDir\atlmfc\include; $ (WindowsSDK_IncludePath) entrées décrites ci-dessus et sélectionnez le paramètre "Hériter du parent ou des valeurs par défaut du projet". Cela devrait résoudre toute dépendance de fichier d'en-tête. problèmes.

Si vous rencontrez également des problèmes de référencement de bibliothèque, faites la même chose avec les entrées du répertoire de bibliothèque, modifiez les paramètres, supprimez les entrées de plateforme explicites et sélectionnez "Hériter des valeurs par défaut du parent ou du projet". (Cela peut être une bonne idée de le faire même si vous ne voyez aucune erreur de l'éditeur de liens, sinon vous pourriez finir par utiliser l'option de compilation du jeu d'outils de plate-forme pour VS2015 lors de la liaison aux bibliothèques pour VS2012).

Je ne sais pas pourquoi cela est foutu pour moi quand je n'ai rencontré personne d'autre ayant des problèmes similaires, je n'ai jamais eu de problèmes pour mettre à niveau les solutions Visual Studio auparavant.

Je n'ai pas non plus découvert pourquoi certaines versions des kits Windows contiennent désormais des en-têtes de plate-forme Windows ou des en-têtes de bibliothèque C++, alors que les SDK contenaient toujours des en-têtes de plate-forme alors que les en-têtes C++ faisaient toujours partie de l'installation de Visual Studio. Il semble qu'un changement comme celui-ci devrait avoir un blog de développement à ce sujet quelque part ou une autre documentation. Mais tant que ça fonctionne, je m'en fiche trop.

J'espère que cela aide quelqu'un.

5
Neutrino