So verwenden Sie vs2019 für die Linux-Remote-Entwicklung

So verwenden Sie vs2019 für die Linux-Remote-Entwicklung

Normalerweise gibt es bei der Entwicklung von Linux-Programmen zwei Möglichkeiten:

  1. Schreiben Sie Programme direkt unter Linux und führen Sie sie zum Testen und Debuggen aus
  2. Remote-Entwicklung mit Tools unter Windows oder Mac OS X

Obwohl ich direkt in der Linux-Umgebung entwickle, gibt es auch viele Leute, die Entwicklungsarbeiten in der Windows-Umgebung durchführen. Wenn sie das vertraute System verlassen und in eine unbekannte Umgebung wechseln, kann dies ihre Arbeitseffizienz beeinträchtigen.

Deshalb werden wir uns heute ansehen, wie man Visual Studio 2019 unter Windows für die Remote-Entwicklung unter Linux verwendet und wie man häufige Fehler vermeidet.

Einführung in die plattformübergreifenden Entwicklungsfunktionen von Visual Studio

Ab Visual Studio 2017 hat Microsoft die plattformübergreifende Entwicklungsfunktion von VS eingeführt. Sie können den Code in VS bearbeiten und dann eine plattformübergreifende Kompilierung und Remote-Debugging durchführen, wodurch die Arbeit, die wir ursprünglich manuell erledigen mussten, automatisiert wird und unsere Belastung erheblich reduziert wird. Zu den unterstützten Plattformen gehören Android und Linux. Auf diese Hauptfunktionen werden wir uns heute konzentrieren.

Vielleicht sind Sie neugierig, wie VS Remote-Entwicklung durchführt. Obwohl Sie Entwicklung durchführen können, ohne dieses Wissen zu verstehen, hoffe ich dennoch, in zwei Minuten eine kurze Erklärung geben zu können.

Die Remote-Entwicklung mit vs gliedert sich in zwei Schritte:

  1. Erstellen Sie eine Verbindung zur Remoteumgebung und lassen Sie VS dann die Systemheaderdateien in der Remoteumgebung mit der lokalen Umgebung synchronisieren (Sie können Headerdateien auch an anderen Stellen angeben, was später erläutert wird). Für die C++-Codevervollständigung sind nur Headerdateien erforderlich.
  2. Wählen Sie beim Schreiben des Codes die entsprechende Remote-Umgebung aus. vs kopiert die Zieldateien und den Code an den angegebenen Speicherort der Remote-Umgebung und kompiliert sie dann entsprechend Ihrer Konfiguration.
  3. VS führt Ihr Programm dann im gdb oder gdbserver der Konsole aus, und währenddessen können Sie die Effizienz und den Komfort des VS-Debuggers voll ausnutzen.

Nachdem Sie die obigen Schritte abgeschlossen haben, können Sie Ihre eigenen plattformübergreifenden Programme in VS debuggen.

Verwenden von vs2019 für die Linux-Remoteentwicklung

Dies ist das Ende der Einführung. Werfen wir einen Blick auf das grafische Tutorial zur Linux-Entwicklung in vs2019. Bevor wir beginnen, müssen wir einige Vorbereitungen treffen:

  1. Installieren Sie vs2019 und überprüfen Sie die C++-Funktion für Linux.
  2. Bereiten Sie eine verfügbare Linux-Remoteumgebung vor, z. B. eine virtuelle Linux-Maschine mit einer konfigurierten statischen IP und der installierten GCC-Toolchain und OpenSSH.

Nun, da wir bereit sind, kommen wir zur Sache.

Erstellen eines Projekts

Nach der Installation der C++-Funktion für Linux wird im Fenster zum Erstellen eines neuen Projekts die Option „Linux“ angezeigt, wie in der Abbildung dargestellt:

Hier haben wir uns für die traditionelle vs-Projekt-Lösung entschieden, um ein leeres Konsolenprogramm zu erstellen. In den nachfolgenden Artikeln erfahren Sie auch, wie Sie ein cmake-Projekt erstellen, was hier vorerst nicht erwähnt wird.

Dazu gibt es nicht viel zu sagen. Wähle den Speicherort des Projekts aus. Beachte, dass es sich um einen lokalen Speicherort handelt. Der Speicherort des Remote-Rechners wird später konfiguriert:

Klicken Sie auf „Erstellen“ und unser Remote-Entwicklungsprojekt wird erfolgreich erstellt.

Konfigurieren eines Remote-Projekts

VS kann die Konfiguration eines leeren Projekts nicht bearbeiten. Daher erstellen wir zunächst eine main.cpp im Projekt und klicken dann auf das obere Menü: Projekt->Eigenschaften. Daraufhin wird die Projektkonfigurationsoberfläche angezeigt:

Der Remotecomputer wird während des Debuggens im Remote Connection Manager hinzugefügt. Im Normalfall sind hier keine Änderungen erforderlich, es sei denn, Sie müssen den Projekttyp oder den Speicherort der zusammengestellten Ergebnisse ändern. Sollten mehrere Remote-Umgebungen vorhanden sein, können Sie diese hier auch auswählen.

Der Debugging-Teil stellt gdb und gdbserver bereit. Ersterer lässt vs eine Konsole unter Linux starten, führt dann gdb darin aus und gibt die Ausgabe zurück. Wenn Ihr Terminal unter Linux mit Farbausgabe konfiguriert ist, erkennt vs diese leider nicht und zeigt sie als Originalzeichenfolgen an. Bei Verwendung von gdbserver wird gdbserver remote aktiviert und es gibt kein Rauschen, wenn das lokale vs die zurückgegebenen Daten analysiert. Hier wählen wir gdbserver. Wenn Sie feststellen, dass Sie keine Haltepunkte setzen können, lesen Sie die Vorschläge von Microsoft und wechseln Sie zurück zur gdb-Lösung:

Als nächstes kommt der Schlüsselpunkt der Konfiguration. Konfigurieren Sie zunächst die Header-Dateien der Remote-Umgebung, die synchronisiert werden müssen. Mit diesen Dateien kann VS Ihren Code automatisch vervollständigen und abfragen:

Der standardmäßig kopierte Pfad enthält unter Linux normalerweise bereits die meisten Header-Dateien und wir müssen normalerweise keine Änderungen vornehmen. Die Synchronisierung der Header-Dateien erfolgt nach dem ersten erfolgreichen Build des Projekts oder einer manuellen Synchronisierung nach dem Hinzufügen einer Remote-Verbindung.

Als nächstes folgt die Wahl des C/C++-Compilers, d. h. die Konfiguration der gcc- und g++-Kompilierungsparameter. Die Erläuterung dieser Parameter geht über den Rahmen unserer Diskussion hinaus. Hier müssen wir nur die entsprechende C++-Standardversion auswählen:

Hier haben wir C++17 gewählt. Die anderen Einstellungen sind dieselben wie bei der Entwicklung unter Windows. VS kann sie automatisch in G++-Parameter umwandeln, daher werde ich hier nicht näher darauf eingehen.

Hinzufügen einer Remote-Umgebung

Nur mit einer Remote-Umgebung können wir Header-Dateien synchronisieren oder Debugging-Vorgänge durchführen.

Wenn Sie Ihr Projekt zum ersten Mal kompilieren oder debuggen, verbindet VS Sie automatisch mit der Remote-Umgebung. Natürlich empfehlen wir, dies unter Debug->Optionen->Plattformübergreifend->Verbindungsmanager einzurichten:

Geben Sie Ihre Remote-IP/Domänennamen ein. Der Standard-SSH-Port ist 22. Aus Sicherheitsgründen müssen Sie ihn auf einen anderen Port ändern. Die Standardkonfiguration wird zu Demonstrationszwecken verwendet. Das Passwort ist dasselbe wie oben. Sie sollten erwägen, für die Anmeldung einen sichereren privaten SSH-Schlüssel zu verwenden.

Nach erfolgreicher Anmeldung wird die Verbindung hinzugefügt. Wir können sehen, dass sich unter dem Manager auch ein Einstellungselement für den Remote-Header-Manager befindet, mit dem die Header-Datei synchronisiert wird:

Durch Klicken auf die Schaltfläche „Aktualisieren“ wird die Synchronisierung der Header-Dateien gestartet, die lokal zwischengespeichert werden. Da eine große Anzahl von Dateien gleichzeitig vom Remote-Computer kopiert werden muss, kann dies lange dauern.

Nachdem die Remote-Umgebung hinzugefügt wurde, können Sie mit dem Schreiben von Code beginnen.

Lokales Schreiben und Remote-Debugging

Jetzt können Sie Code für Linux in VS schreiben und die automatische Vervollständigung funktioniert einwandfrei:

Sie sehen, dass die Headerdateien und -strukturen in Linux wiedererkennbar sind. Wenn Sie feststellen, dass eine automatische Vervollständigung nicht möglich ist (passiert normalerweise nach dem Hinzufügen einer Remoteverbindung oder dem Ändern der Projekteinstellungen), versuchen Sie, vs zu schließen und erneut zu öffnen. Wenn das nicht funktioniert, versuchen Sie, Intellisense zu aktualisieren oder die Headerdateien erneut zu synchronisieren.

Nach der Bearbeitung können wir auf die Schaltfläche „Debuggen“ klicken, um unser Programm auszuführen:

Beachten Sie, dass die erstellte Architektur mit der Remote-Umgebung übereinstimmen muss. Wenn die Remote-Umgebung beispielsweise x64 ist, können Sie hier x64 oder x86 auswählen, aber nicht arm, da sonst ein Fehler gemeldet wird.

Dies ist der Testcode, der die Version des aktuellen Linux-Systemkernels ausgibt:

#include <sys/utsname.h>
#include <iostream>
#einschließen <cstdio>

int main()
{
  automatischer Start = Chrono::hochauflösende Uhr::jetzt();
  utsname Namen;
  wenn (uname(&namen) != 0) {
    std::perror("kann unames nicht abrufen");
  }

  std::cout << "Linux-Kernelversion: " << Namen.Release << std::endl;
}

Klicken Sie auf Debug->Linux-Konsole. Daraufhin wird eine interaktive Konsole angezeigt, in der Sie Inhalte eingeben oder die Ausgabe des Programms anzeigen können:

Das Programm wurde erfolgreich ausgeführt.

Vermeiden Sie Fallstricke

Nachdem die Remote-Kompilierung erfolgreich abgeschlossen wurde, können wir den vs-Debugger verwenden, um Haltepunkte zu setzen, Variablen an Haltepunkten anzuzeigen und sogar dynamische Leistungsanalysen auf dem laufenden Linux durchzuführen.

Doch zuvor gilt es noch einige Fallstricke zu vermeiden.

Chinesische verstümmelte Schriftzeichen

Die durch Kodierungsprobleme verursachten Probleme stehen immer an erster Stelle. Schließlich werden die Leute unweigerlich nervös, wenn sie sehen, dass die erwartete Ausgabe tatsächlich aus einer Reihe verstümmelter Zeichen besteht.

Wie wir alle wissen, waren Kodierungsprobleme schon immer ein schwieriges Problem, insbesondere wenn die chinesische Umgebung unter Windows normalerweise GB18030 oder GBK ist, während sie unter Linux einheitlich als UTF-8 verwendet wird.

Schauen wir uns ein praktisches Beispiel an. Wenn unser Programm nur ASCII-Zeichen enthält, kommt es normalerweise nicht so leicht zu Problemen. Deshalb fügen wir einige chinesische Zeichen hinzu:

#include <sys/utsname.h>
#include <iostream>
#einschließen <cstdio>
#include <Zeichenfolge>

int main()
{
  utsname Namen;
  wenn (uname(&namen) != 0) {
    std::perror("kann unames nicht abrufen");
  }

  std::cout << "Linux-Kernelversion: " << Namen.Release << std::endl;
  std::cout << "Eingabeinhalt: ";
  std::string-Eingabe;
  std::cin >> Eingabe;
  std::cout << "Sie haben eingegeben: " << input << std::endl;
}

Für das obige Testprogramm haben wir einige chinesische Ausgabeinformationen hinzugefügt. Öffnen Sie nun die Konsole zum Debuggen:

Sie können sehen, dass die chinesische Ausgabe verstümmelt ist. Wir geben einige Informationen ein und dies ist das Ergebnis:

Es ist ersichtlich, dass die im Programm geschriebenen chinesischen Schriftzeichen verstümmelt sind, unsere Eingabe jedoch nicht. Der Grund ist ganz einfach. Bei der Eingabe in der Linux-Konsolenumgebung ist die Standardkodierung utf8, sodass unsere Eingabe korrekt kodiert ist und der Inhalt in der Quelldatei GB18030 ist, sodass in der Linux-Konsole (die Daten standardmäßig in utf8 dekodiert und anzeigt) verstümmelte Zeichen auftreten.

Wenn man die Fehlerursache kennt, ist die Lösung sehr einfach. Man muss nur die Kodierung der Quelldatei in utf8 ändern. Wir wählen die einfachste Methode und ändern die Kodierung in高級保存選項(diese Menüoption ist standardmäßig ausgeblendet, und im Internet gibt es viele Materialien, die erklären, wie man sie anzeigt):

Speichern Sie die Datei nach dem Einstellen. Jetzt wurde die Dateikodierung auf utf8 geändert.

Führen Sie nun das geänderte Programm aus:

Auch die Laufergebnisse sind normal:

Verwenden von mathematischen Funktionen und Bibliotheken von Drittanbietern

Die Verwendung der von der Standardbibliothek bereitgestellten mathematischen Funktionen unter Linux ist ebenfalls ein häufiges Problem. Je nachdem, ob Sie cpp oder c verwenden, treten die folgenden Situationen auf:

  1. Bei Verwendung von cpp ist libstdc++ von libm abhängig, d. h. wenn Sie Ihr Programm mit g++ kompilieren, wird die Mathematikbibliothek automatisch verknüpft.
  2. Wenn es bei Verwendung von C in der Form sqrt(4) vorliegt, stellt der neuere gcc ein Ersetzungsmaß bereit, und es besteht keine Notwendigkeit, libm explizit zu verknüpfen.
  3. Als Fortsetzung des vorherigen Punktes: Wenn Ihr Argument eine Variable ist, verlangt der Compiler möglicherweise von Ihnen, libm zu verknüpfen.

Normalerweise müssen wir uns unter Windows darüber keine Gedanken machen, aber bei der Verwendung der Sprache C unter Linux ist dieses Problem schwer zu ignorieren.

Um auf Nummer sicher zu gehen, sollten Sie beim Schreiben eines C-Programms, das mathematische Funktionen verwendet, immer angeben, dass Sie gegen libm verknüpfen.

Darüber hinaus müssen Sie auch vorsichtig sein, wenn Sie Bibliotheken von Drittanbietern wie Boost verwenden. Unter Windows geben wir normalerweise das zusätzliche Include-Verzeichnis und das zusätzliche Bibliotheksverzeichnis an, um normal zu kompilieren. Unter Linux muss der Name der Linkbibliothek jedoch explizit angegeben werden, sodass wir ihn in den Projekteigenschaften festlegen.

Unter Linux können wir pkg-config verwenden, um die oben genannte sich wiederholende Arbeit zu reduzieren, aber in vs können wir dieses Tool nicht direkt verwenden. Wenn Ihr Projekt eine große Anzahl von Bibliotheken von Drittanbietern verwendet, wird dies zu einem großen Problem. Wenn Sie dieses Problem lösen möchten, können Sie auf das vs+cmake-Build-Projekt verweisen, das ich in nachfolgenden Artikeln vorstellen werde.

Als nächstes fügen wir dem Beispiel einige Boost-Chrono-Funktionstests hinzu. Unter Linux müssen wir -lboost_chrono angeben. Hier ist die Einstellung:

Hier ist der vollständige Code:

#include <sys/utsname.h>
#include <iostream>
#einschließen <cstdio>
#include <Zeichenfolge>
#include <boost/chrono.hpp>

int main()
{
  Namespace Chrono = Boost::Chrono;
  automatischer Start = Chrono::hochauflösende Uhr::jetzt();
  utsname Namen;
  wenn (uname(&namen) != 0) {
    std::perror("kann unames nicht abrufen");
  }

  std::cout << "Linux-Kernelversion: " << Namen.Release << std::endl;
  std::cout << "Eingabeinhalt: ";
  std::string-Eingabe;
  std::cin >> Eingabe;
  std::cout << "Sie haben eingegeben: " << input << std::endl;
  automatischer Zähler = chrono::duration_cast<chrono::milliseconds>(chrono::high_resolution_clock::now() - Start);
  std::cout << "Das Programm wurde ausgeführt: " << counter.count() << "ms\n";
}

Klicken Sie auf die Schaltfläche „Ausführen“. Das Programm kann normal debuggt werden. Andernfalls wird ein Fehler gemeldet:

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • Methoden und Schritte für vs2019+cmake zur Realisierung der Linux-Remote-Entwicklung

<<:  Lösung zum automatischen Neustart von MySQL

>>:  Mehrere Methoden für js zur Bestimmung der horizontalen und vertikalen Bildschirmansichtsfenstererkennung von mobilen Endgeräten

Artikel empfehlen

Vue-Anfängerhandbuch: Umgebungserstellung und Erste Schritte

Inhaltsverzeichnis Erster Blick Erstellen einer V...

So implementieren Sie eine MySQL-Master-Slave-Replikation basierend auf Docker

Vorwort Die MySQL Master-Slave-Replikation ist di...

Detailliertes Tutorial zur Verwendung von stimulsoft.reports.js mit vue-cli

vue-cli verwendet stimulsoft.reports.js (Tutorial...

Einführung in JavaScript-Zahlen- und Mathematikobjekte

Inhaltsverzeichnis 1. Zahlen in JavaScript 2. Mat...

JavaScript-Canvas zum Erzielen von Regentropfeneffekten

In diesem Artikelbeispiel wird der spezifische Co...

So überprüfen Sie, ob die Firewall in Linux ausgeschaltet ist

1. Servicemethode Überprüfen Sie den Firewall-Sta...

Implementierungscode zur Installation von vsftpd in Ubuntu 18.04

Installieren Sie vsftpd $ sudo apt-get installier...

Detaillierte Erklärung der 10 häufigsten HTTP-Statuscodes

Der HTTP-Statuscode ist ein dreistelliger Code, d...

So konvertieren Sie ein JavaScript-Array in eine Baumstruktur

1. Nachfrage Das Backend stellt solche Daten bere...

Wie verfolgt Vue Datenänderungen?

Inhaltsverzeichnis Hintergrund Beispiel Missverst...

Code zur Änderung des CSS-Bildlaufleistenstils

Code zur Änderung des CSS-Bildlaufleistenstils .s...

Erklärung zur Änderung des npm Taobao-Spiegels

1. Nutzung auf höchster Ebene 1. Installieren Sie...