通常、Linux プログラムを開発する場合、次の 2 つのオプションがあります。
Linux環境で直接開発を行っているものの、Windows環境で開発業務を行っている方も多くいらっしゃいます。慣れ親しんだシステムを離れて不慣れな環境に移行すると、作業効率に影響が出る可能性があります。 そこで今日は、Linux リモート開発のために Windows 上で Visual Studio 2019 を使用する方法と、よくある落とし穴を回避する方法について説明します。 Visual Studio のクロスプラットフォーム開発機能の紹介 Visual Studio 2017 から、Microsoft は VS のクロスプラットフォーム開発機能を開始しました。VS でコードを編集し、クロスプラットフォームのコンパイルとリモート デバッグを実行できるため、本来手動で行う必要があった作業が自動化され、負担が大幅に軽減されます。サポートされているプラットフォームには Android と Linux が含まれており、これらが本日焦点を当てる主な機能です。 VS がどのようにリモート開発を実行するのか興味があるかもしれません。この知識を理解していなくても開発は実行できますが、それでも 2 分で簡単に説明したいと思います。 vs を使用したリモート開発は、次の 2 つのステップに分かれています。
上記の手順を完了すると、VS で独自のクロスプラットフォーム プログラムをデバッグできるようになります。 Linux リモート開発に vs2019 を使用する これで紹介は終わりです。vs2019 での Linux 開発のグラフィック チュートリアルを見てみましょう。始める前に、いくつか準備が必要です。
準備が整いましたので、仕事に取り掛かりましょう。 プロジェクトを作成する Linux 用 c++ 関数をインストールすると、図に示すように、新しいプロジェクトを作成するためのパネルに Linux オプションが表示されます。 ここでは、従来の vs プロジェクト ソリューションを使用して空のコンソール プログラムを構築することを選択しました。後続の記事では、cmake プロジェクトの作成方法も確認できますが、ここでは説明しません。 以下では特に言うことはありません。プロジェクトの保存場所を選択します。ローカルの場所であることに注意してください。リモート マシンの場所は後で構成されます。 「作成」をクリックすると、リモート開発プロジェクトが正常に作成されます。 リモートプロジェクトの構成 VS は空のプロジェクトの構成を編集できないため、最初にプロジェクト内に デバッグ中にリモート コンピューターがリモート接続マネージャーに追加されます。通常、プロジェクト タイプやコンパイルされた結果が保存される場所を変更する必要がない限り、ここで変更する必要はありません。リモート環境が複数ある場合は、ここで選択することもできます。 デバッグ部分は 次は、構成の重要なポイントです。まず、同期する必要があるリモート環境のヘッダー ファイルを構成します。これらのファイルを使用すると、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 を使用するかによって、次のような状況が発生します。
通常、Windows ではこれを心配する必要はありませんが、Linux で C 言語を使用する場合はこの問題を無視することは困難です。 したがって、安全のために、数学関数を使用する C プログラムを作成する場合は、常に libm にリンクするように指定することをお勧めします。 また、boostなどのサードパーティライブラリを使用する場合にも注意が必要です。 Windows では、通常、追加のインクルード ディレクトリと追加のライブラリ ディレクトリを指定してコンパイルしますが、Linux ではリンク ライブラリの名前を明示的に指定する必要があるため、プロジェクトのプロパティで設定します。 Linux では pkg-config を使って上記の繰り返し作業を減らすことができますが、vs ではこのツールを直接使うことができません。プロジェクトでサードパーティのライブラリを大量に使う場合、これは大きな問題になります。この問題を解決したい場合は、次回の記事で紹介する vs+cmake ビルド プロジェクトを参考にしてください。 次に、例にいくつかの boost chrono 機能テストを追加します。Linux では、 完全なコードは次のとおりです。 #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 を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: モバイル端末の水平および垂直画面ビューポート検出を決定するための js のいくつかの方法
Baiduで検索しました。 。 chcp コマンドを使用して、cmd の文字エンコーディングを 65...
透明を含む5つの肌の色を変更するには50行のコードが必要です最初にコードをお渡ししますので、ご自身で...
float:左/右/なし; 1. 同じレベルフローティング(1)ブロックレベル要素を同じ行に表示する...
1. ファイル名検索を実行するwhich ('実行可能ファイル' を検索) //PA...
質問: 360ブラウザの互換モードなど、一部のブラウザでは、 <td style="...
腹筋コマンドの原則Apache の ab コマンドは、マルチスレッドの同時リクエストをシミュレートし...
1. provideとinjectの説明Provide と Inject により、ネストされたコンポ...
マインドマップ彼はおそらく次のように見えるでしょう: インターネット上の実装のほとんどは d3.js...
MySQL 組み込みの日付関数 TIMESTAMPDIFF は、2 つの日付間の秒数、分数、時間数、...
最近、次のデータ型のデータベースに遭遇しました:decimal(14,4)発生した問題は次のとおりで...
上記のように材料を準備します(ps: hadoop-3.1.2-srcはhadoop-3.1.2に変...
コードをコピーコードは次のとおりです。 <本文> //マーキーの助けを借りて<MA...
以下はすべて仮想マシン上で実行されます1. pip3をインストールするsudo apt で pyth...
1. ツール今必要なツールは2つあります: MySQLサーバー (mysql-5.7.18)、MyS...
1. GraphVis 公式サイトにアクセスして、対応する js をダウンロードします。js の新し...