Tutoriel : Créer des projets multiplateformes C++ dans Visual Studio

Le développement en C et C++ dans Visual Studio ne cible plus seulement les environnements Windows. Ce tutoriel montre comment utiliser Visual Studio pour le développement multiplateforme C++ sur Windows et Linux. Elle est basée sur CMake. Vous n’avez donc pas besoin de créer ou de générer des projets Visual Studio. Lorsque vous ouvrez un dossier qui contient un fichier CMakeLists.txt, Visual Studio configure automatiquement les paramètres IntelliSense et de génération. Vous pouvez rapidement commencer à modifier, générer et déboguer votre code localement sur Windows. Ensuite, basculez votre configuration pour effectuer la même opération sur Linux, à partir de Visual Studio.

Dans ce tutoriel, vous allez apprendre à :

  • Cloner un projet CMake open source à partir de GitHub
  • Ouvrir le projet dans Visual Studio
  • Générer et déboguer un exécutable cible sur Windows
  • Ajouter une connexion à une machine Linux
  • Générer et déboguer la même cible sur Linux

Prérequis

  • Configurer Visual Studio pour le développement multiplateforme en C++

    • Tout d’abord, installez Visual Studio et choisissez le développement Desktop avec C++ et le développement Linux avec des charges de travail C++. Cette installation minimale est de seulement 3 Go. Selon la vitesse de téléchargement, l’installation ne doit pas prendre plus de 10 minutes.
  • Configurer une machine Linux pour le développement multiplateforme en C++

    • Visual Studio ne nécessite pas de distribution particulière de Linux. Le système d’exploitation peut s’exécuter sur une machine physique, dans une machine virtuelle ou dans le cloud. Vous pouvez également utiliser le Sous-système Windows pour Linux (WSL). Toutefois, pour ce didacticiel, un environnement graphique est requis. WSL n’est pas recommandé ici, car il est principalement destiné aux opérations de ligne de commande.

    • Visual Studio nécessite ces outils sur l’ordinateur Linux : compilateurs C++, gdb, , ssh, rsyncmakeet zip. Sur les systèmes Debian, vous pouvez utiliser cette commande pour installer ces dépendances :

      sudo apt install -y openssh-server build-essential gdb rsync make zip
      
    • Visual Studio nécessite une version récente de CMake sur l’ordinateur Linux sur lequel le mode serveur est activé (au moins 3.8). Microsoft fournit une build universelle de CMake que vous pouvez installer sur n’importe quelle distribution Linux. Nous vous recommandons d’utiliser cette build pour vous assurer que vous disposez des fonctionnalités les plus récentes. Vous pouvez obtenir les fichiers binaires de CMake à partir de la duplication (fork) Microsoft dans le dépôt CMake sur GitHub. Accédez à cette page et téléchargez la version qui correspond à l’architecture système sur votre machine Linux, puis marquez-la en tant qu’exécutable :

      wget <path to binary>
      chmod +x cmake-3.11.18033000-MSVC_2-Linux-x86_64.sh
      
    • Vous pouvez voir les options d’exécution du script en spécifiant --help. Nous vous recommandons d’utiliser l’option permettant de spécifier l’installation -prefix dans le chemin /usr , car /usr/bin est l’emplacement par défaut où Visual Studio recherche CMake. L’exemple suivant montre le script Linux-x86_64. Modifiez-le si nécessaire si vous utilisez une autre plateforme cible.

      sudo ./cmake-3.11.18033000-MSVC_2-Linux-x86_64.sh --skip-license --prefix=/usr
      
  • Git pour Windows installé sur votre machine Windows.

  • Un compte GitHub.

Cloner un projet CMake open source à partir de GitHub

Ce tutoriel utilise le Kit de développement logiciel (SDK) Bullet Physics sur GitHub. Il fournit des simulations de détection de collision et de physique pour de nombreuses applications. Le Kit de développement logiciel (SDK) inclut des exemples de programmes exécutables qui compilent et s’exécutent sans avoir à écrire d’autres codes. Ce didacticiel ne modifie pas le code source ni les scripts de génération. Pour commencer, clonez le dépôt bullet3 à partir de GitHub sur l’ordinateur sur lequel Visual Studio est installé.

git clone https://github.com/bulletphysics/bullet3.git
  1. Dans le menu principal de Visual Studio, choisissez Ouvrir un fichier >> CMake. Accédez au CMakeLists.txt fichier à la racine du dépôt bullet3 que vous avez téléchargé.

    Screenshot of Visual Studio menu showing File > Open > C Make. A folder has yet to be opened. This is just the menu opened to this point.

    Dès que vous ouvrez le dossier, votre structure de dossiers devient visible dans le Explorateur de solutions.

    Screenshot of the Solution Explorer window in Folder View mode. It displays the contents of the project (files and folders) and CMakeLists.txt is highlighted.

    Cette vue montre le contenu réel du disque ; ce n’est pas une vue logique ou filtrée. Par défaut, elle n’affiche pas les fichiers masqués.

  2. Choisissez le bouton Afficher tous les fichiers pour afficher tous les fichiers du dossier.

    Screenshot of the Solution Explorer window with the Show All Files button highlighted. This button sits on top of the solution explorer window and to the right.

Basculer vers une vue des cibles

Quand vous ouvrez un dossier qui utilise CMake, Visual Studio génère automatiquement le cache CMake. Cette opération peut prendre plus ou moins de temps selon la taille de votre projet.

  1. Dans la fenêtre Sortie, sélectionnez Afficher la sortie à partir de, puis choisissez CMake pour superviser l’état du processus de génération du cache. Une fois l’opération terminée, elle indique « Extraction d’informations cibles terminée ».

    Screenshot of the Output window. The Show output from: dropdown is set to CMake.

    Une fois cette opération terminée, IntelliSense est configuré. Vous pouvez générer le projet et déboguer l’application. Visual Studio affiche désormais une vue logique de la solution, en fonction des cibles spécifiées dans les fichiers CMakeLists.

  2. Utilisez le bouton Solutions et dossiers dans l’Explorateur de solutions pour passer à la vue des cibles de CMake.

    Screenshot of the Solutions and Folders button in the Solution Explorer. It is selected, showing a dropdown with a choice for c:\projects\bullet3 and another choice for CMake Targets View, which is selected.

    Voici à quoi ressemble cette vue pour le Kit de développement logiciel (SDK) Bullet :

    Screenshot of the Solution Explorer CMake targets view. It contains an entry called BULLET_PHYSICS Project, under which are entries like App_BasicExample (executable), App_ExampleBrowser (executable), and so on.

    La vue des cibles offre une vue plus intuitive du contenu de cette base de code source. Vous pouvez voir que certaines cibles sont des bibliothèques alors que d’autres sont des exécutables.

  3. Développez un nœud dans la vue des cibles de CMake pour voir les fichiers de code source associés, quel que soit leur emplacement sur le disque.

Ajouter une configuration x64-Debug explicite pour Windows

Visual Studio crée une configuration x64-Debug par défaut pour Windows. Les configurations indiquent à Visual Studio quelle plateforme cible utiliser pour CMake. La configuration par défaut n’est pas représentée sur le disque. Lorsque vous ajoutez explicitement une configuration, Visual Studio crée un fichier appelé CMake Paramètres.json. Il est rempli avec les paramètres de toutes les configurations que vous spécifiez.

  1. Ajoutez une nouvelle configuration. Ouvrez la liste déroulante Configuration dans la barre d’outils et sélectionnez Gérer les configurations.

    Screenshot of the Configuration drop-down in the toolbar. Manage Configurations... is selected.

    L’éditeur de Paramètres CMake s’ouvre. Sélectionnez l’authentification verte plus sur le côté gauche de l’éditeur pour ajouter une nouvelle configuration. La boîte de dialogue Ajouter une configuration à CMake Paramètres s’affiche :

    Screenshot of the Add Configuration to CMakeSettings dialog. It has entries such as Linux-Debug, x86-Debug. x64-Debug is selected.

    Cette boîte de dialogue affiche toutes les configurations incluses dans Visual Studio, ainsi que toutes les configurations personnalisées que vous créez. Si vous souhaitez continuer à utiliser une configuration x64-Debug qui doit être la première que vous ajoutez. Sélectionnez x64-Debug, puis choisissez le bouton Sélectionner . Visual Studio crée le fichier CMake Paramètres.json avec une configuration pour x64-Debug et l’enregistre sur le disque. Vous pouvez utiliser un nom de votre choix pour vos configurations en changeant le paramètre de nom directement dans CMakeSettings.json.

Définir un point d’arrêt, générer et exécuter sur Windows

Dans cette étape, nous débogueons un exemple de programme qui illustre la bibliothèque Bullet Physics.

  1. Dans l’Explorateur de solutions, sélectionnez AppBasicExampleGui et développez-le.

  2. Ouvrez le fichier BasicExample.cpp .

  3. Définissez un point d’arrêt qui est atteint lorsque vous cliquez dans l’application en cours d’exécution. L’événement de clic est géré dans une méthode au sein d’une classe d’assistance. Pour y accéder rapidement :

    1. Sélectionnez CommonRigidBodyBase que le struct BasicExample est dérivé de. C’est autour de la ligne 30.

    2. Cliquez avec le bouton droit et choisissez Atteindre la définition. Vous êtes maintenant dans l’en-tête CommonRigidBodyBase.h.

    3. Dans l’affichage du navigateur au-dessus de votre source, vous devez voir que vous êtes dans le CommonRigidBodyBase. À droite, vous pouvez sélectionner les membres à examiner. Ouvrez la liste déroulante et sélectionnez mouseButtonCallback cette option pour accéder à la définition de cette fonction dans l’en-tête.

      Screenshot of the Member list toolbar drop-down in the editor window. It list functions such as getRayTo(in x, int y). The mouse button callback method is highlighted.

  4. Ajoutez un point d’arrêt sur la première ligne dans cette fonction. Il est atteint lorsque vous cliquez sur un bouton de la souris dans la fenêtre de l’application, lorsqu’il est exécuté sous le débogueur Visual Studio.

  5. Pour lancer l’application, sélectionnez la liste déroulante de lancement dans la barre d’outils. Il s’agit de l’icône de lecture verte qui indique « Sélectionner l’élément de démarrage ». Dans la liste déroulante, sélectionnez AppBasicExampleGui.exe. Le nom de l’exécutable figure maintenant sur le bouton de lancement :

    Screenshot of the Visual Studio toolbar launch drop-down. AppBasicExampleGui.exe is selected, but other options are visible such as App_ExampleBrowser.exe, App_HelloWorld.exe, and others.

  6. Choisissez le bouton de lancement pour générer l’application et les dépendances nécessaires, puis lancez-la avec le débogueur Visual Studio attaché. Après quelques instants, l’application exécutée apparaît :

    Screenshot of the running application. It's a collection of colored blocks on a yellow plane.

  7. Déplacez votre souris dans la fenêtre d’application, puis cliquez sur un bouton pour déclencher le point d’arrêt. Le point d’arrêt ramène Visual Studio au premier plan, et l’éditeur affiche la ligne où l’exécution est suspendue. Vous pouvez inspecter les variables d’application, les objets, les threads et la mémoire, ou parcourir votre code de manière interactive. Choisissez Continuer de laisser l’application reprendre, puis quittez-la normalement. Ou, arrêtez l’exécution dans Visual Studio à l’aide du bouton d’arrêt.

Ajouter une configuration Linux et se connecter à la machine distante

  1. Ajoutez une configuration Linux. Cliquez avec le bouton droit sur le fichier CMakeSettings.json dans la vue de l’Explorateur de solutions, puis sélectionnez Ajouter une configuration. Comme précédemment, la boîte de dialogue Ajouter la configuration à CMakeSettings s’affiche. Sélectionnez Linux-Debug cette fois, puis enregistrez le fichier CMake Paramètres.json (ctrl+ s).

  2. Visual Studio 2019 version 16.6 ou ultérieure Faites défiler vers le bas vers le bas de l’éditeur de Paramètres CMake, puis sélectionnez Afficher les paramètres avancés. Sélectionnez Makefiles Unix comme générateur CMake, puis enregistrez le fichier CMake Paramètres.json (ctrl + s).

  3. Sélectionnez Linux-Debug dans la liste déroulante de configuration.

    Screenshot of the launch configuration drop-down. The visible options are: x64-Debug, Linux-Debug, and Manage Configurations.

    Si c’est la première fois que vous vous connectez à un système Linux, la boîte de dialogue Connecter au système distant s’affiche.

    Screenshot of the Visual Studio Connect to Remote System dialog.

    La boîte de dialogue contient des champs pour le nom d’hôte, le port, le nom d’utilisateur, le type d’authentification et le mot de passe. Tous les champs sont vides, sauf que le port est défini sur 22 et le type d’authentification est défini sur Mot de passe.

    Si vous avez déjà ajouté une connexion à distance, vous pouvez ouvrir cette fenêtre en accédant à Tools > Options > Cross Platform > Connecter ion Manager.

  4. Fournissez les informations de connexion à votre machine Linux et choisissez Connecter. Visual Studio ajoute cette machine à CMake Paramètres.json comme connexion par défaut pour Linux-Debug. Il extrait également les en-têtes de votre ordinateur distant, de sorte que vous obtenez IntelliSense spécifique à cette connexion distante. Ensuite, Visual Studio envoie vos fichiers à l’ordinateur distant et génère le cache CMake sur le système distant. Ces étapes peuvent prendre un certain temps, en fonction de la vitesse de votre réseau et de la puissance de votre ordinateur distant. Vous savez qu’il est terminé lorsque le message « Extraction d’informations cibles terminée » s’affiche dans la fenêtre de sortie CMake.

Définir un point d’arrêt, générer et exécuter sur Linux

Étant donné qu’il s’agit d’une application de bureau, vous devez fournir des informations de configuration supplémentaires à la configuration de débogage.

  1. Dans la vue Cibles CMake, cliquez avec le bouton droit sur AppBasicExampleGui, puis choisissez Déboguer et Lancer Paramètres pour ouvrir le fichier launch.vs.json qui se trouve dans le sous-dossier .vs masqué. Ce fichier est propre à votre environnement de développement local. Vous pouvez le déplacer à la racine de votre projet si vous souhaitez le vérifier et le partager avec votre équipe. Dans ce fichier, une configuration a été ajoutée pour AppBasicExampleGui. Ces paramètres par défaut fonctionnent dans la plupart des cas, mais pas ici. Étant donné qu’il s’agit d’une application de bureau, vous devez fournir des informations supplémentaires pour lancer le programme afin de pouvoir le voir sur votre ordinateur Linux.

  2. Pour rechercher la valeur de la variable DISPLAY d’environnement sur votre machine Linux, exécutez cette commande :

    echo $DISPLAY
    

    Dans la configuration d’AppBasicExampleGui, il existe un tableau de paramètres , « pipeArgs ». Il contient une ligne : « ${debuggerCommand} ». Il s’agit de la commande qui démarre gdb sur l’ordinateur distant. Visual Studio doit exporter l’affichage dans ce contexte avant l’exécution de cette commande. Par exemple, si la valeur de votre affichage est :1, modifiez cette ligne comme suit :

    "export DISPLAY=:1;${debuggerCommand}",
    
  3. Lancez et déboguez votre application. Ouvrez la liste déroulante Sélectionner l’élément de démarrage dans la barre d’outils et choisissez AppBasicExampleGui. Ensuite, choisissez l’icône de lecture verte dans la barre d’outils ou appuyez sur F5. L’application et ses dépendances sont basées sur l’ordinateur Linux distant, puis lancées avec le débogueur Visual Studio attaché. Sur votre machine Linux distante, vous devez voir apparaître une fenêtre d’application.

  4. Déplacez votre souris dans la fenêtre de l’application, puis cliquez sur un bouton. Le point d’arrêt est atteint. L’exécution du programme s’interrompt, Visual Studio revient au premier plan et vous voyez votre point d’arrêt. Vous devez également voir une fenêtre de console Linux s’ouvrir dans Visual Studio. La fenêtre fournit la sortie de la machine Linux distante et peut également accepter l’entrée pour stdin. Comme n’importe quelle fenêtre Visual Studio, vous pouvez l’ancrer là où vous préférez la voir. Sa position est conservée dans les prochaines sessions.

    Screenshot of the Visual Studio Linux Console Window.

    La sortie dans la fenêtre indique que les fonctions C11 chargées dynamiquement à l’aide de dlopen/dlsym sont OK, un contexte GL 3.0 a été créé et le contexte de rendu Direct GLX obtenu et rendu actuel. La fenêtre contient diverses informations de version pour GL_VENDOR, GL_VERSION, GL_SHADING_LANGUAGE_VERSION, et ainsi de suite.

  5. Vous pouvez alors inspecter les variables, les objets, les threads et la mémoire de l’application, et exécuter votre code pas à pas de manière interactive à l’aide de Visual Studio. Mais cette fois, vous effectuez tout sur un ordinateur Linux distant au lieu de votre environnement Windows local. Vous pouvez choisir Continuer de laisser l’application reprendre et quitter normalement, ou vous pouvez choisir le bouton Arrêter, comme avec l’exécution locale.

  6. Si vous examinez la fenêtre Pile des appels, vous voyez les appels à x11OpenGLWindow puisque Visual Studio a lancé l’application sur Linux.

    The Visual Studio Call Stack window, showing Linux call stack.

    La pile d’appels affiche le point d’arrêt sur CommonRigidBodyBase ::mouseMoveCallback, et les appels qui précèdent celui-ci comme OnMouseMove, X11OpenGLWindow ::p umpMessage, etc.

Ce que vous avez appris

Dans ce tutoriel, vous avez cloné une base de code directement à partir de GitHub. Vous avez généré, exécuté et débogué sur Windows sans modification. Ensuite, vous avez utilisé la même base de code, avec des modifications de configuration mineures, pour générer, exécuter et déboguer sur une machine Linux distante.

Étapes suivantes

Consultez les rubriques suivantes pour en savoir plus sur la configuration et le débogage des projets CMake dans Visual Studio :