Freigeben über


Lernprogramm: Erstellen plattformübergreifender C++-Projekte in Visual Studio

Die Entwicklung von Visual Studio C und C++ ist nicht mehr nur für Windows vorgesehen. In diesem Lernprogramm wird gezeigt, wie Sie die plattformübergreifende Entwicklung von Visual Studio für C++ unter Windows und Linux verwenden. Sie basiert auf CMake, sodass Sie keine Visual Studio-Projekte erstellen oder generieren müssen. Wenn Sie einen Ordner öffnen, der eine CMakeLists.txt Datei enthält, konfiguriert Visual Studio die IntelliSense- und Buildeinstellungen automatisch. Sie können schnell mit dem Bearbeiten, Erstellen und Debuggen ihres Codes lokal unter Windows beginnen. Wechseln Sie dann in Visual Studio zur gleichen Konfiguration, um dasselbe unter Linux zu tun.

In diesem Tutorial lernen Sie Folgendes:

  • Klonen eines Open-Source-CMake-Projekts von GitHub
  • Öffnen des Projekts in Visual Studio
  • Erstellen und Debuggen eines ausführbaren Ziels unter Windows
  • Hinzufügen einer Verbindung zu einem Linux-Computer
  • Erstellen und Debuggen desselben Ziels unter Linux

Voraussetzungen

  • Einrichten von Visual Studio für die plattformübergreifende C++-Entwicklung

    • Installieren Sie zunächst Visual Studio, und wählen Sie die Desktopentwicklung mit C++- und Linux-Entwicklungsumgebungen mit C++-Workloads aus. Diese minimale Installation beträgt nur 3 GB. Je nach Downloadgeschwindigkeit sollte die Installation nicht mehr als 10 Minuten dauern.
  • Einrichten eines Linux-Computers für die plattformübergreifende C++-Entwicklung

    • Visual Studio erfordert keine bestimmte Verteilung von Linux. Das Betriebssystem kann auf einem physischen Computer, in einer VM oder in der Cloud ausgeführt werden. Sie können auch das Windows-Subsystem für Linux (WSL) verwenden. Für dieses Lernprogramm ist jedoch eine grafische Umgebung erforderlich. WSL wird hier nicht empfohlen, da sie hauptsächlich für Befehlszeilenvorgänge vorgesehen ist.

    • Visual Studio erfordert diese Tools auf dem Linux-Computer: C++-Compiler, gdb, , ssh, rsync, makeund zip. Auf Debian-basierten Systemen können Sie diesen Befehl verwenden, um diese Abhängigkeiten zu installieren:

      sudo apt install -y openssh-server build-essential gdb rsync make zip
      
    • Visual Studio erfordert eine aktuelle Version von CMake auf dem Linux-Computer mit aktiviertem Servermodus (mindestens 3.8). Microsoft produziert einen universellen Build von CMake, den Sie auf jeder Linux-Distribution installieren können. Es wird empfohlen, diesen Build zu verwenden, um sicherzustellen, dass Sie über die neuesten Features verfügen. Sie können die CMake-Binärdateien aus dem Microsoft-Fork des CMake-Repos auf GitHub abrufen. Wechseln Sie zu dieser Seite, und laden Sie die Version herunter, die der Systemarchitektur auf Ihrem Linux-Computer entspricht, und markieren Sie sie dann als ausführbare Datei:

      wget <path to binary>
      chmod +x cmake-3.11.18033000-MSVC_2-Linux-x86_64.sh
      
    • Sie sehen die Optionen zum Ausführen des Skripts mit --help. Es wird empfohlen, die Option zum Angeben der -prefix Installation im Pfad "/usr " zu verwenden, da "/usr/bin " der Standardspeicherort ist, an dem Visual Studio nach CMake sucht. Das folgende Beispiel zeigt das Linux-x86_64-Skript. Ändern Sie sie nach Bedarf, wenn Sie eine andere Zielplattform verwenden.

      sudo ./cmake-3.11.18033000-MSVC_2-Linux-x86_64.sh --skip-license --prefix=/usr
      
  • Auf Ihrem Windows-Computer muss Git für Windows installiert sein.

  • Ein GitHub-Konto.

Klonen eines Open-Source-CMake-Projekts von GitHub

In diesem Lernprogramm wird das Bullet Physics SDK auf GitHub verwendet. Es bietet Kollisionserkennung und Physiksimulationen für viele Anwendungen. Das SDK enthält Beispiel-ausführbare Programme, die kompiliert und ausgeführt werden, ohne anderen Code schreiben zu müssen. In diesem Lernprogramm werden keine Quellcode- oder Buildskripts geändert. Klonen Sie zunächst das Repository bullet3 von GitHub auf den Computer, auf dem Visual Studio installiert ist.

git clone https://github.com/bulletphysics/bullet3.git
  1. Wählen Sie im Hauptmenü von Visual Studio die Option Datei > Öffnen > CMake. Navigieren Sie zu der CMakeLists.txt-Datei im Stamm des von Ihnen heruntergeladenen bullet3-Repos.

    Screenshot des Visual Studio-Menüs mit

    Sobald Sie den Ordner öffnen, wird die Ordnerstruktur im Projektmappen-Explorer angezeigt.

    Screenshot des Fensters

    Diese Ansicht zeigt Ihnen genau, was sich auf dem Datenträger befindet, keine logische oder gefilterte Ansicht. Standardmäßig werden keine ausgeblendeten Dateien angezeigt.

  2. Wählen Sie die Schaltfläche " Alle Dateien anzeigen " aus, um alle Dateien im Ordner anzuzeigen.

    Screenshot des Fensters

Wechseln zur Zielansicht

Wenn Sie einen Ordner öffnen, der CMake verwendet, generiert Visual Studio automatisch den CMake-Cache. Dieser Vorgang kann je nach Größe des Projekts einige Minuten dauern.

  1. Wählen Sie im Ausgabefenster die Option "Ausgabe anzeigen" aus , und wählen Sie dann "CMake " aus, um den Status des Cachegenerierungsprozesses zu überwachen. Wenn der Vorgang abgeschlossen ist, lautet die Meldung "Zielinformationenextraktion abgeschlossen".

    Screenshot des Ausgabefensters. Das Dropdown-Menü

    Nach Abschluss dieses Vorgangs ist IntelliSense konfiguriert. Sie können das Projekt erstellen und die Anwendung debuggen. Visual Studio zeigt nun eine logische Ansicht der Lösung basierend auf den in den CMakeLists-Dateien angegebenen Zielen an.

  2. Verwenden Sie die Schaltfläche "Lösungen und Ordner " im Projektmappen-Explorer , um zur Ansicht "CMake-Ziele" zu wechseln.

    Screenshot der Schaltfläche „Lösungen und Ordner“ im Projektmappen-Explorer. Er ist ausgewählt und zeigt ein Dropdown mit einer Auswahl für c:\projects\bullet3 und eine andere Auswahl für die CMake-Zielansicht, die ausgewählt ist.

    So sieht diese Ansicht für das Bullet SDK aus:

    Screenshot der CMake-Zielansicht des Projektmappen-Explorers. Er enthält einen Eintrag namens BULLET_PHYSICS Project, unter dem sich Einträge wie App_BasicExample (ausführbar), App_ExampleBrowser (ausführbar) usw. befinden.

    Mit der Zielansicht erhalten Sie eine intuitivere Ansicht der Inhalte einer Quellbasis. Sie können sehen, dass einige Ziele Bibliotheken sind und andere ausführbare Dateien sind.

  3. Erweitern Sie einen Knoten in der CMake-Zielansicht (Targets-View), um die Quellcodedateien anzuzeigen, unabhängig vom Speicherort auf dem Datenträger.

Hinzufügen einer expliziten Windows x64-Debug-Konfiguration

Visual Studio erstellt eine x64-Debug-Standardkonfiguration für Windows. Konfigurationen sind, wie Visual Studio versteht, welches Plattformziel es für CMake verwenden wird. Die Standardkonfiguration wird auf dem Datenträger nicht dargestellt. Wenn Sie eine Konfiguration explizit hinzufügen, erstellt Visual Studio eine Datei namensCMakeSettings.json. Es wird mit Den Einstellungen für alle von Ihnen angegebenen Konfigurationen aufgefüllt.

  1. Fügen Sie eine neue Konfiguration hinzu. Öffnen Sie die Dropdownliste "Konfiguration " in der Symbolleiste, und wählen Sie " Konfigurationen verwalten" aus.

    Screenshot der Dropdownliste

    Der CMake-Einstellungs-Editor wird geöffnet. Wählen Sie auf der linken Seite des Editors das grüne Pluszeichen aus, um eine neue Konfiguration hinzuzufügen. Das Dialogfeld "Konfiguration zu CMakeSettings hinzufügen " wird angezeigt:

    Screenshot des Dialogfelds

    In diesem Dialogfeld werden alle Konfigurationen angezeigt, die in Visual Studio enthalten sind, sowie alle benutzerdefinierten Konfigurationen, die Sie erstellen. Wenn Sie weiterhin eine x64-Debug-Konfiguration verwenden möchten, sollte dies der erste sein, den Sie hinzufügen. Wählen Sie "x64-Debuggen" und dann die Schaltfläche " Auswählen " aus. Visual Studio erstellt die CMakeSettings.json Datei mit einer Konfiguration für x64-Debug und speichert sie auf dem Datenträger. Sie können beliebige Namen für Ihre Konfigurationen verwenden, indem Sie den Namensparameter direkt in CMakeSettings.jsonändern.

Festlegen eines Breakpoints, Erstellen und Ausführen unter Windows

In diesem Schritt debuggen wir ein Beispielprogramm, das die Bullet Physics-Bibliothek demonstriert.

  1. Wählen Sie „AppBasicExampleGui“ im Projektmappen-Explorer, und erweitern Sie es.

  2. Öffnen Sie die Datei BasicExample.cpp.

  3. Legen Sie einen Breakpoint fest, der erreicht werden soll, wenn Sie in der ausgeführten Anwendung klicken. Das Click-Ereignis wird in einer Methode innerhalb einer Hilfsklasse behandelt. So gelangen Sie schnell dorthin:

    1. Wählen Sie CommonRigidBodyBase aus, von dem die Struktur BasicExample abgeleitet ist. Es liegt um Zeile 30.

    2. Klicken Sie mit der rechten Maustaste, und wählen Sie "Gehe zu Definition" aus. Jetzt befinden Sie sich im Header "CommonRigidBodyBase.h".

    3. In der Browseransicht oberhalb Ihrer Quelle sollten Sie sehen, dass Sie sich in der CommonRigidBodyBaseDatei befinden. Rechts können Sie Mitglieder auswählen, die überprüft werden sollen. Öffnen Sie die Dropdownliste, und wählen Sie aus mouseButtonCallback , um zur Definition dieser Funktion in der Kopfzeile zu wechseln.

      Screenshot der Dropdownliste

  4. Setzen Sie in der ersten Zeile dieser Funktion einen Breakpoint. Es wird ausgelöst, wenn Sie in das Fenster der Anwendung klicken, während sie im Visual Studio-Debugger ausgeführt wird.

  5. Klicken Sie auf das Startdropdownmenü in der Symbolleiste, um die Anwendung zu starten. Es ist das Symbol mit dem grünen Wiedergabesymbol, das "Startelement auswählen" besagt. Wählen Sie in der Dropdownliste AppBasicExampleGui.exeaus. Der name der ausführbaren Datei wird jetzt auf der Startschaltfläche angezeigt:

    Screenshot des Dropdown-Menüs zum Starten der Visual Studio-Symbolleiste. AppBasicExampleGui.exe ist ausgewählt, aber andere Optionen sind sichtbar, z. B. App_ExampleBrowser.exe, App_HelloWorld.exe und andere.

  6. Wählen Sie die Startschaltfläche aus, um die Anwendung und die erforderlichen Abhängigkeiten zu erstellen, und starten Sie sie dann mit dem angefügten Visual Studio-Debugger. Nach ein paar Momenten wird die ausgeführte Anwendung angezeigt:

    Screenshot der ausgeführten Anwendung. Es ist eine Sammlung farbiger Blöcke auf einer gelben Ebene.

  7. Bewegen Sie den Mauszeiger in das Anwendungsfenster, und drücken Sie anschließend eine Taste, um den Breakpoint auszulösen. Durch den Breakpoint wird Visual Studio wieder im Vordergrund angezeigt, und der Editor zeigt die Zeile an, in der die Ausführung pausiert wurde. Sie können die Anwendungsvariablen, Objekte, Threads und Arbeitsspeicher überprüfen oder den Code interaktiv durchlaufen. Wählen Sie "Weiter" , damit die Anwendung fortgesetzt werden kann, und beenden Sie sie dann normal. Oder beenden Sie die Ausführung in Visual Studio mithilfe der Schaltfläche "Beenden".

Hinzufügen einer Linux-Konfiguration und Herstellen einer Verbindung mit dem Remotecomputer

  1. Fügen Sie eine Linux-Konfiguration hinzu. Klicken Sie in der Projektmappen-Explorer-Ansicht mit der rechten Maustaste auf die CMakeSettings.json Datei, und wählen Sie "Konfiguration hinzufügen" aus. Das gleiche Dialogfeld "Konfiguration zu CMakeSettings hinzufügen" wird wie zuvor angezeigt. Wählen Sie dieses Mal Linux-Debug aus, und speichern Sie dann die CMakeSettings.json Datei (STRG+S).

  2. Visual Studio 2019, Version 16.6 oder höher Scrollen Sie nach unten zum unteren Rand des CMake-Einstellungs-Editors, und wählen Sie "Erweiterte Einstellungen anzeigen" aus. Wählen Sie Unix Makefiles als CMake-Generator aus, und speichern Sie dann die CMakeSettings.json Datei (STRG+s).

  3. Wählen Sie "Linux-Debug " in der Konfigurations-Dropdownliste aus.

    Screenshot der Dropdownliste

    Wenn Sie zum ersten Mal eine Verbindung mit einem Linux-System herstellen, wird das Dialogfeld " Mit Remotesystem verbinden" angezeigt.

    Screenshot des Dialogfelds

    Das Dialogfeld enthält Felder für den Hostnamen, den Port, den Benutzernamen, den Authentifizierungstyp und das Kennwort. Alle Felder sind leer, außer Port ist auf 22 festgelegt, und der Authentifizierungstyp ist auf "Kennwort" festgelegt.

    Wenn Sie bereits eine Remoteverbindung hinzugefügt haben, können Sie dieses Fenster öffnen, indem Sie zu Tools Options >> Cross Platform > Connection Manager navigieren.

  4. Geben Sie die Verbindungsinformationen an Ihren Linux-Computer an , und wählen Sie "Verbinden" aus. Visual Studio fügt diesen Computer in „CMakeSettings.json“ als Standardverbindung für Linux-Debug hinzu. Außerdem werden die Header von Ihrem Remotecomputer abgerufen, damit Sie spezifische IntelliSense-Funktionen für diese Remoteverbindung verwenden können. Als Nächstes sendet Visual Studio Ihre Dateien an den Remotecomputer und generiert den CMake-Cache auf dem Remotesystem. Diese Schritte können je nach Geschwindigkeit Ihres Netzwerks und der Leistung Ihres Remotecomputers einige Zeit in Anspruch nehmen. Sie wissen, dass die Meldung "Zielinformationenextraktion abgeschlossen" im CMake-Ausgabefenster angezeigt wird.

Festlegen eines Breakpoints, Erstellen und Ausführen unter Linux

Da es sich um eine Desktopanwendung ist, müssen Sie der Debugkonfiguration einige weitere Konfigurationsinformationen bereitstellen.

  1. Klicken Sie in der CMake-Zielansicht mit der rechten Maustaste auf „AppBasicExampleGui“, und wählen Sie Einstellungen für Debuggen und Starten aus, um die Datei „launch.vs.json“ zu öffnen, die sich im versteckten .vs-Unterordner befindet. Diese Datei ist lokal in Ihrer Entwicklungsumgebung. Sie können sie zum Stamm Ihres Projekts verschieben, wenn Sie sie bei Ihrem Team einchecken und speichern möchten. In dieser Datei wurde eine Konfiguration für AppBasicExampleGui hinzugefügt. Diese Standardeinstellungen funktionieren in den meisten Fällen, aber nicht hier. Da es sich um eine Desktopanwendung handelt, müssen Sie zusätzliche Informationen bereitstellen, um das Programm zu starten, damit Sie es auf Ihrem Linux-Computer sehen können.

  2. Führen Sie den folgenden Befehl aus, um den Wert der Umgebungsvariable DISPLAY auf Ihrem Linux-Computer zu ermitteln:

    echo $DISPLAY
    

    In der Konfiguration für AppBasicExampleGui gibt es ein Parameterarray "pipeArgs". Sie enthält eine Zeile: "${debuggerCommand}". Es ist der Befehl, der gdb auf dem Remotecomputer startet. Visual Studio muss die Anzeige in diesen Kontext exportieren, bevor dieser Befehl ausgeführt wird. Wenn beispielsweise der Wert der Anzeige lautet :1, ändern Sie diese Zeile wie folgt:

    "export DISPLAY=:1;${debuggerCommand}",
    
  3. Starten sie ihre Anwendung, und debuggen Sie sie. Öffnen Sie die Dropdownliste "Startelement auswählen " in der Symbolleiste, und wählen Sie "AppBasicExampleGui" aus. Wählen Sie als Nächstes entweder das grüne Wiedergabesymbol in der Symbolleiste aus, oder drücken Sie F5. Die Anwendung und ihre Abhängigkeiten basieren auf dem Remote-Linux-Computer und werden dann mit dem angefügten Visual Studio-Debugger gestartet. Auf Ihrem Remote-Linux-Computer sollte ein Anwendungsfenster angezeigt werden.

  4. Bewegen Sie die Maus in das Anwendungsfenster, und klicken Sie auf eine Schaltfläche. Daraufhin wird der Breakpoint erreicht. Die Ausführung des Programms wird am Breakpoint angehalten, und Visual Studio wird wieder im Vordergrund angezeigt. Außerdem sollte in Visual Studio ein Linux-Konsolenfenster angezeigt werden. Das Fenster zeigt eine Ausgabe vom Remote-Linux-Computer und kann auch Eingaben für stdin akzeptieren. Wie jedes Visual Studio-Fenster können Sie es an eine bevorzugte Position andocken, an der es angezeigt werden soll. Die Position des Fensters wird in zukünftigen Sitzungen beibehalten.

    Screenshot des Visual Studio Linux-Konsolenfensters.

    Die Ausgabe im Fenster gibt an, dass die mit dlopen/dlsym dynamisch geladenen C11-Funktionen OK sind, ein GL 3.0-Kontext erstellt und der Direct-GLX-Rendering-Kontext abgerufen und aktuell gemacht wurde. Das Fenster enthält verschiedene Versionsinformationen für GL_VENDOR, GL_VERSION, GL_SHADING_LANGUAGE_VERSION usw.

  5. Sie können die Anwendungsvariablen, Objekte, Threads und den Arbeitsspeicher inspizieren und Ihren Code interaktiv mit Visual Studio durchlaufen. Dieses Mal tun Sie es jedoch auf einem Remote-Linux-Computer anstelle Ihrer lokalen Windows-Umgebung. Sie können "Weiter" auswählen, damit die Anwendung normal fortgesetzt und beendet wird, oder Sie können die Stoppschaltfläche wie bei der lokalen Ausführung auswählen.

  6. Sehen Sie sich das Fenster "Aufrufstapel" an und betrachten Sie die Aufrufe an x11OpenGLWindow, seitdem die Anwendung unter Linux von Visual Studio gestartet wurde.

    Das Visual Studio-Anrufstapelfenster mit dem Linux-Aufrufstapel.

    Der Anrufstapel zeigt den Haltepunkt auf CommonRigidBodyBase::mouseMoveCallback und die Aufrufe, die ihm vorausgehen, wie OnMouseMove, X11OpenGLWindow:: pumpMessage und so weiter.

Was Sie gelernt haben

In diesem Lernprogramm haben Sie eine Codebasis direkt von GitHub geklont. Sie haben sie ohne Änderungen auf Windows erstellt, ausgeführt und gedebuggt. Anschließend haben Sie dieselbe Codebasis mit geringfügigen Konfigurationsänderungen zum Erstellen, Ausführen und Debuggen auf einem Remote-Linux-Computer verwendet.

Nächste Schritte

Weitere Informationen zum Konfigurieren und Debuggen von CMake-Projekten in Visual Studio: