Linux リモート開発に vs2019 を使用する方法

Linux リモート開発に vs2019 を使用する方法

通常、Linux プログラムを開発する場合、次の 2 つのオプションがあります。

  1. Linux上で直接プログラムを作成し、テストとデバッグのために実行する
  2. Windows または Mac OS X のツールを使用したリモート開発

Linux環境で直接開発を行っているものの、Windows環境で開発業務を行っている方も多くいらっしゃいます。慣れ親しんだシステムを離れて不慣れな環境に移行すると、作業効率に影響が出る可能性があります。

そこで今日は、Linux リモート開発のために Windows 上で Visual Studio 2019 を使用する方法と、よくある落とし穴を回避する方法について説明します。

Visual Studio のクロスプラットフォーム開発機能の紹介

Visual Studio 2017 から、Microsoft は VS のクロスプラットフォーム開発機能を開始しました。VS でコードを編集し、クロスプラットフォームのコンパイルとリモート デバッグを実行できるため、本来手動で行う必要があった作業が自動化され、負担が大幅に軽減されます。サポートされているプラ​​ットフォームには Android と Linux が含まれており、これらが本日焦点を当てる主な機能です。

VS がどのようにリモート開発を実行するのか興味があるかもしれません。この知識を理解していなくても開発は実行できますが、それでも 2 分で簡単に説明したいと思います。

vs を使用したリモート開発は、次の 2 つのステップに分かれています。

  1. リモート環境への接続を作成し、VS でリモート環境のシステム ヘッダー ファイルをローカルに同期させます (他の場所のヘッダー ファイルを指定することもできます。これについては後で説明します)。C++ コード補完にはヘッダー ファイルのみが必要です。
  2. コードが記述されたら、適切なリモート環境を選択します。vs はターゲット ファイルとコードをリモート環境の指定された場所にコピーし、構成に従ってコンパイルします。
  3. その後、VS はコンソールの gdb または gdbserver でプログラムを実行し、その間、VS デバッガーによってもたらされる効率性と利便性を十分に享受できます。

上記の手順を完了すると、VS で独自のクロスプラットフォーム プログラムをデバッグできるようになります。

Linux リモート開発に vs2019 を使用する

これで紹介は終わりです。vs2019 での Linux 開発のグラフィック チュートリアルを見てみましょう。始める前に、いくつか準備が必要です。

  1. vs2019 をインストールし、Linux 関数の c++ を確認します。
  2. 静的 IP が設定され、GCC ツールチェーンと openssh がインストールされた Linux 仮想マシンなど、利用可能な Linux リモート環境を準備します。

準備が整いましたので、仕事に取り掛かりましょう。

プロジェクトを作成する

Linux 用 c++ 関数をインストールすると、図に示すように、新しいプロジェクトを作成するためのパネルに Linux オプションが表示されます。

ここでは、従来の vs プロジェクト ソリューションを使用して空のコンソール プログラムを構築することを選択しました。後続の記事では、cmake プロジェクトの作成方法も確認できますが、ここでは説明しません。

以下では特に言うことはありません。プロジェクトの保存場所を選択します。ローカルの場所であることに注意してください。リモート マシンの場所は後で構成されます。

「作成」をクリックすると、リモート開発プロジェクトが正常に作成されます。

リモートプロジェクトの構成

VS は空のプロジェクトの構成を編集できないため、最初にプロジェクト内にmain.cppを作成し、上部のメニューの [プロジェクト] -> [プロパティ] をクリックすると、プロジェクト構成インターフェイスが表示されます。

デバッグ中にリモート コンピューターがリモート接続マネージャーに追加されます。通常、プロジェクト タイプやコンパイルされた結果が保存される場所を変更する必要がない限り、ここで変更する必要はありません。リモート環境が複数ある場合は、ここで選択することもできます。

デバッグ部分はgdbgdbserverを提供します。前者は、vs が Linux 上でコンソールを起動し、その中で gdb を実行して出力を返すようにします。Linux 上のターミナルがカラー出力に設定されている場合、残念ながら vs はそれらを認識せず、元の文字列として表示します。gdbserver を使用すると、gdbserver はリモートで有効になり、返されたデータをローカルの vs が解析するときにノイズは発生しません。ここでは gdbserver を選択します。ブレークポイントを設定できない場合は、Microsoft の提案を参照して gdb ソリューションに戻してください。

次は、構成の重要なポイントです。まず、同期する必要があるリモート環境のヘッダー ファイルを構成します。これらのファイルを使用すると、VS はコードを自動的に補完してプロンプトを表示できます。

デフォルトでコピーされたパスには通常、Linux 上のほとんどのヘッダー ファイルが既に含まれており、通常は変更する必要はありません。ヘッダー ファイルの同期は、プロジェクトの最初のビルドが成功した後、またはリモート接続を追加した後に手動で同期された後に行われます。

次は C/C++ コンパイラの選択、つまり gcc と g++ のコンパイル パラメータの構成です。これらのパラメータの説明はここでは説明しません。ここでは適切な C++ 標準バージョンを選択するだけです。

ここでは c++17 を選択しました。その他の設定は Windows で開発する場合と同じです。VS が自動的に g++ パラメータに変換できるので、ここでは詳細には触れません。

リモート環境の追加

リモート環境でのみ、ヘッダー ファイルを同期したり、デバッグ操作を実行したりできます。

プロジェクトを初めてコンパイルまたはデバッグすると、VS は自動的にリモート環境に接続します。もちろん、[デバッグ] -> [オプション] -> [クロスプラットフォーム] -> [接続マネージャー] で設定することをお勧めします。

リモート IP/ドメイン名を入力します。デフォルトの SSH ポートは 22 です。セキュリティ上の理由から、別のポートに変更する必要があります。デフォルトの設定はデモンストレーションの目的で使用されます。パスワードは上記と同じです。ログインするには、より安全な SSH 秘密キーの使用を検討する必要があります。

ログインが成功すると、接続が追加されます。マネージャーの下に、ヘッダー ファイルを同期するために使用されるリモート ヘッダー マネージャーの設定項目もあることがわかります。

[更新] ボタンをクリックすると、ヘッダー ファイルの同期が開始され、ローカルにキャッシュされます。一度に多数のファイルをリモートからコピーする必要があるため、時間がかかる場合があります。

リモート環境が追加されたので、コードの記述を開始できます。

ローカル書き込みとリモートデバッグ

これで、VS で Linux 用のコードを記述できるようになり、自動補完も正常に動作するようになりました。

Linux のヘッダー ファイルと構造が認識できることがわかります。自動補完が不可能な場合は (通常、リモート接続を追加した後やプロジェクト設定を変更した後に発生します)、vs を閉じて再度開いてみてください。それでも問題が解決しない場合は、インテリセンスを更新するか、ヘッダー ファイルを再同期してみてください。

編集後、デバッグ ボタンをクリックしてプログラムを実行できます。

ビルドされたアーキテクチャはリモート環境と一致している必要があることに注意してください。たとえば、リモート環境が x64 の場合、ここで x64 または x86 を選択できますが、arm を選択することはできません。選択するとエラーが報告されます。

これは、現在の Linux システム カーネルのバージョンを出力するテスト コードです。

#include <sys/utsname.h>
#include <iostream>
#include <cstdio>

int メイン()
{
  自動開始 = chrono::high_resolution_clock::now();
  utsname名;
  (uname(&names) != 0)の場合{
    std::perror("unames を取得できません");
  }

  std::cout << "Linux カーネル バージョン: " << names.release << std::endl;
}

[デバッグ] -> [Linux コンソール] をクリックすると、対話型コンソールが表示され、コンテンツを入力したり、プログラムの出力を確認したりできます。

プログラムは正常に実行されました。

落とし穴を避ける

リモート コンパイルが正常に完了したら、vs デバッガーを使用してブレークポイントを設定し、ブレークポイントの変数を表示し、実行中の Linux で動的パフォーマンス分析を実行することもできます。

しかし、その前に、避けなければならない落とし穴がまだいくつかあります。

中国語の文字化け

エンコードの問題によって生じるトラブルは常に最優先されます。結局、期待される出力が実際には文字化けした文字の集まりであるとわかれば、人々は必然的に不安になります。

ご存知のとおり、エンコードの問題は常に難しい問題でした。特に、Windows 上の中国語環境は通常 GB18030 または GBK であるのに対し、Linux では utf8 に統一されているためです。

実際の例を見てみましょう。通常、プログラムに ASCII 文字のみが含まれている場合、問題が発生する可能性は低いため、いくつかの中国語の文字を追加します。

#include <sys/utsname.h>
#include <iostream>
#include <cstdio>
#include <文字列>

int メイン()
{
  utsname名;
  (uname(&names) != 0)の場合{
    std::perror("unames を取得できません");
  }

  std::cout << "Linux カーネル バージョン: " << names.release << std::endl;
  std::cout << "入力内容: ";
  std::string 入力;
  std::cin >> 入力;
  std::cout << "入力した内容: " << input << std::endl;
}

上記のテスト プログラムでは、中国語の出力情報を追加しました。次に、デバッグ用にコンソールを開きます。

中国語の出力が文字化けしているのがわかります。いくつかの情報を入力すると、次のようになります。

プログラムに書かれた中国語の文字は文字化けしているのに、私たちの入力は文字化けしていないことがわかります。理由は非常に簡単です。Linux コンソール環境で入力する場合、デフォルトのエンコードは utf8 なので、入力は正しくエンコードされますが、ソースファイルの内容は GB18030 なので、Linux コンソール (デフォルトでは utf8 でデータをデコードして表示) では文字化けが発生します。

エラーの原因がわかれば、解決方法は非常に簡単です。ソース ファイルのエンコーディングを utf8 に変更するだけです。最も簡単な方法を選択し、高級保存選項でエンコーディングを変更します (このメニュー オプションは既定では非表示になっており、インターネット上には表示方法を紹介する資料が多数あります)。

設定後、ファイルを保存します。これでファイルのエンコーディングが utf8 に変更されました。

次に、変更したプログラムを実行します。

実行結果も正常です。

数学関数とサードパーティライブラリの使用

Linux の標準ライブラリが提供する数学関数の使用もよくある問題です。cpp を使用するか c を使用するかによって、次のような状況が発生します。

  1. cpp を使用する場合、libstdc++ は libm に依存するため、プログラムを g++ でコンパイルすると、数学ライブラリが自動的にリンクされます。
  2. C を使用する場合、 sqrt(4)の形式であれば、新しい gcc が代替手段を提供するため、 libm を明示的にリンクする必要はありません。
  3. 前の点に引き続き、引数が変数の場合、コンパイラは libm のリンクを要求することがあります。

通常、Windows ではこれを心配する必要はありませんが、Linux で C 言語を使用する場合はこの問題を無視することは困難です。

したがって、安全のために、数学関数を使用する C プログラムを作成する場合は、常に libm にリンクするように指定することをお勧めします。

また、boostなどのサードパーティライブラリを使用する場合にも注意が必要です。 Windows では、通常、追加のインクルード ディレクトリと追加のライブラリ ディレクトリを指定してコンパイルしますが、Linux ではリンク ライブラリの名前を明示的に指定する必要があるため、プロジェクトのプロパティで設定します。

Linux では pkg-config を使って上記の繰り返し作業を減らすことができますが、vs ではこのツールを直接使うことができません。プロジェクトでサードパーティのライブラリを大量に使う場合、これは大きな問題になります。この問題を解決したい場合は、次回の記事で紹介する vs+cmake ビルド プロジェクトを参考にしてください。

次に、例にいくつかの boost chrono 機能テストを追加します。Linux では、 -lboost_chronoを指定する必要があります。設定は次のとおりです。

完全なコードは次のとおりです。

#include <sys/utsname.h>
#include <iostream>
#include <cstdio>
#include <文字列>
#include <boost/chrono.hpp>

int メイン()
{
  名前空間 chrono = boost::chrono;
  自動開始 = chrono::high_resolution_clock::now();
  utsname名;
  (uname(&names) != 0)の場合{
    std::perror("unames を取得できません");
  }

  std::cout << "Linux カーネル バージョン: " << names.release << std::endl;
  std::cout << "入力内容: ";
  std::string 入力;
  std::cin >> 入力;
  std::cout << "入力した内容: " << input << std::endl;
  自動カウンター = chrono::duration_cast<chrono::milliseconds>(chrono::high_resolution_clock::now() - start);
  std::cout << "プログラムが実行されました: " << counter.count() << "ms\n";
}

[実行] ボタンをクリックすると、プログラムを通常どおりデバッグできます。それ以外の場合は、エラーが報告されます。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Linuxリモート開発を実現するためのvs2019+cmakeの方法と手順

<<:  モバイル端末の水平および垂直画面ビューポート検出を決定するための js のいくつかの方法

>>:  MySQL インデックスの左端原則のサンプルコード

推薦する

JavaScript スタイル オブジェクトと CurrentStyle オブジェクトのケース スタディ

1. スタイルオブジェクトスタイル オブジェクトは単一のスタイル宣言を表し、スタイルが適用されている...

Javascriptでシングルトンパターンを実装する方法

目次概要コードの実装シングルトンパターンの簡易版改良版プロキシバージョンシングルトンモード遅延シング...

Linux の crw、brw、lrw などのファイル属性は何ですか?

ファイルとは何ですか?すべてのファイルは実際には文字列のストリームですが、適切な解析方法を使用すると...

モバイル端末におけるビューポートの具体的な使用法についての簡単な説明

目次1. 基本概念1.1 2種類のピクセル1.2 3つのビューポート2. ビューポート設定3. 1回...

MySQLデータベースインデックスの詳細な説明

目次1. MySQLインデックスの紹介2. MySQLの5種類のインデックスの詳しい説明1. 総合索...

MySQL のマスタースレーブレプリケーションと読み取り書き込み分離の原理と使用法の詳細な説明

この記事では、例を使用して、MySQL マスター/スレーブ レプリケーションと読み取り/書き込み分離...

CentOS7 に MySQL データベースをインストールしてデバッグする詳細な手順 [例]

この例では、デバッグ用の MySQL データベースをダウンロードしてインストールする必要があります。...

js 属性オブジェクトの hasOwnProperty メソッドの使用

オブジェクトの hasOwnProperty() メソッドは、オブジェクトに特定の独自の (継承され...

MySQL ジョイントテーブル更新デー​​タの詳細な例

1.MySQL UPDATE JOIN構文MySQL では、UPDATE ステートメントでJOIN句...

MySQLデータベースがNULLを可能な限り避ける理由

MySQL の多くのテーブルには、NULL が列のデフォルト属性であるため、アプリケーションが NU...

nginx httpモジュールのデータ保存構造の概要

このセクションから、http モジュールの実装原理について説明します。http モジュールで非常に重...

Windows 10 での Hyperledger Fabric 1.4 環境構築プロセスの図

内容Hyperledger fabric1.4環境のWindows 10でのセットアップ前提条件Wi...

Nginx 転送ソケットポート設定の詳細な説明

Nginx によるソケット ポート転送の一般的なシナリオ: オンライン学習アプリケーションでは、通常...

Node-Redを使用してMySQLデータベースに接続する方法

Node-red をデータベース (mysql) に接続するには、まずコンピューターに MySQL ...

Linux での tcpdump コマンド例の詳細な説明

序文簡単に言えば、tcpdump は、ネットワーク上のトラフィックをダンプし、ユーザーの定義に従って...