Visual StudioでUbuntu開発
「Windows」の統合開発環境(IDE)である「Visual Studio」を利用して、「Ubuntu(Linux)」上で動作するソフトウェアの開発が可能なりました。もちろんデバッグも可能です。
「Visual C++」とある通り、C++による開発が可能です。
どうやっているのか?
ソフトウェアのビルドに必要なツール(コンパイラーやリンカーなど)やデバッガーは「Ubuntu」のものが「Ubuntu」上で動作します。ソフトウェアのビルド時、「Visual Studio」はSSHで「Ubuntu」に接続し、ソースコードを「Ubuntu」側にコピーします。
そして「Ubuntu」側でビルドを行うように「Visual Studio」がコマンドを発行(実行)します。
デバッグは「Visual Studio」がGDBサーバーにリモート接続し、GDB経由でビルドしたソフトウェアを実行します。
ソースコードの編集や管理は「Visual Studio」が行い、それ以外の作業はリモート接続した「Ubuntu」側で行います。
1.Ubuntu側の準備
まずUbuntu側の準備です。ここでは例として「Ubuntu 16.10 64bit版」を利用します。
またC++のソースコードからソフトウェアをビルドします。
事前にソフトウェアのビルドに必要なパッケージをインストールしておきましょう。
それに加え、「Visual Studio」から作業するために必要なパッケージをインストールする必要があります。
1-1.GDBサーバーとSSHサーバーのインストール
以下のコマンドを実行し、GDBサーバーとSSHサーバーをインストールします。
sudo apt-get install openssh-server g++ gdb gdbserver
1-2.SSHサーバーの設定と起動
インストールが完了したら、SSHサーバーの設定(特に認証に関する設定)を行います。SSHサーバーの設定は、「/etc/ssh/sshd_config」ファイルで行います。
設定を行わなくても利用できますが、セキュリティー上好ましくないため、SSHサーバーの設定を行っておくことを推奨します。
例えば、ポート設定の変更や公開鍵認証の利用を検討しましょう。
ここではSSHサーバーの設定方法は紹介しません。
1-3.SSHサーバーの起動
SSHサーバーの設定が完了したら、以下のコマンドを実行しSSHサーバーを起動します。
sudo systemctl start ssh
SSHサーバーの設定を変更し、設定を反映するためにSSHサーバーを再起動したければ、以下のコマンドを実行します。
sudo systemctl restart ssh
SSHサーバーの起動状態は、以下のコマンドで確認できます。
sudo systemctl status ssh
以下のようになっていれば、OKです。
2.Visual Studioのセットアップ
ここでは「Visual Studio」側で必要な作業を行います。ここでは例として「Visual Studio 2017 RC版」を利用します。
2-1.Visual C++ for Linux Development拡張機能のインストール
「Visual Studio 2017」より前の「Visual Studio」を利用している場合は、「Visual C++ for Linux Development」拡張機能をインストールします。「Visual C++ for Linux Development」は、「Visual Studio」の拡張機能の管理画面からインストールを行うことも可能です。
Visual Studio 2017 RC版の場合
「Visual Studio 2017 RC版」を利用している場合、インストール時に「C++によるLinux開発」にチェックを入れてからインストールを行えばOKです。すでに「Visual Studio 2017 RC版」をインストール済みの場合は、プロジェクトの新規作成画面から「Visual Studioインストーラーを開く」をクリックし、「C++によるLinux開発」を有効にしてください。
2-2.SSH接続の追加
次にSSHの設定を行います。「ツール」メニュー > 「オプション」をクリックし、左側の項目一覧から「Cross Platform」を展開し、「Connenction Manager」をクリックします。
上記の画面が表示されたら「Add」ボタンをクリックします。
補足
SSHの設定はソフトウェアのビルド時に行うことも可能です。2-3.SSHの接続設定
以下の画面が表示されたら、SSHサーバーに接続するための設定を入力し、「Connect」ボタンをクリックします。2-4.設定完了
以下のように接続が追加されます。3.プロジェクトの作成
ここでは例として新規にプロジェクトを作成します。3-1.プロジェクトの新規作成
「ファイル」メニュー > 「新規作成」 >「プロジェクト」をクリックします。プロジェクト作成画面が表示されるので、用途に合わせてプロジェクトの種類を選択し、「OK」ボタンをクリックします。
ここでは例として「空のプロジェクト」を選択しました。
3-2.プロジェクトの設定
必要に応じてプロジェクトの設定を行います。プロジェクトの設定画面は、「ソリューションエクスプローラー」から設定を行いたいプロジェクトを選択し、「プロジェクト」メニュー > 「プロパティ」から表示できます。
左側の項目一覧から「全般」を選択し、「構成の種類」から生成するソフトウェアの種類が指定できます。
3-3.デバッグの設定
こちらも必要に応じてプロジェクトの設定を行います。デバッグ実行時にエラーが発生する場合は、左側の項目一覧から「デバッグ」を選択し、「デバッグモード」を「gdb」に変更してみてください。
3-4.複数のSSHの接続先がある時は
以下のように複数のSSHの接続先がある時は、プロジェクトの設定から接続先を指定できます。左側の項目一覧から「全般」を選択し、「リモートビルドマシン」から接続先を指定できます。
4.ビルドやデバッグ
ここから実際にソースコードの編集やビルドを行っていきます。4-1.ソースコードの作成
ソースコードを作成します。4-2.ソフトウェアのビルド
「ビルド」メニューからソリューションもしくはプロジェクトのビルドを行います。「出力」ペインに以下のようにビルドログが出力されます。
1>------ ビルド開始: プロジェクト:Project1, 構成:Debug x64 ------
1>Validating architecture
1>Validating sources
1>Copying sources remotely
1>Starting remote build
1>Compiling sources:
1>main.cpp
1>Linking objects
1>Project1.vcxproj -> c:\Users\kledg\documents\visual studio 2017\Projects\Project1\Project1\bin\x64\Debug\Project1.out
========== ビルド: 1 正常終了、0 失敗、0 更新不要、0 スキップ ==========
1>Validating architecture
1>Validating sources
1>Copying sources remotely
1>Starting remote build
1>Compiling sources:
1>main.cpp
1>Linking objects
1>Project1.vcxproj -> c:\Users\kledg\documents\visual studio 2017\Projects\Project1\Project1\bin\x64\Debug\Project1.out
========== ビルド: 1 正常終了、0 失敗、0 更新不要、0 スキップ ==========
もっと詳細なログが欲しい場合は
もっと詳細なログが欲しい場合は、「ツール」メニューの「オプション」をクリックします。左側の項目一覧から「ビルド/実行」を選択し、「MSBuildプロジェクトビルドの出力の詳細」設定を変更します。
4-3.ビルド完了
ビルドを行うと「Ubuntu」側でビルドが実行され、以下のように様々なファイルが生成されます。実行可能なファイルは、「Project1.out」です。
4-4.デバッグ
後は普通にデバッグ(リモートGDBデバッガー)すればOKです。ブレークポイントを設定すれば、以下のようにブレークポイントが設定された行で処理が停止します。
ソースコードの文字コードに注意
「Visual Studio」からファイルを新規に作成し保存すると、ソースコードの文字コード(符号化方式)が「Shift-JIS(CP932)」になります。「Ubuntu」ではデフォルトの文字コードに「UTF-8」を採用しています。
そのため日本語が含まれたソースコードをビルドすると、文字化けが発生します。
あらかじめソースコードは「UTF-8」に統一しておくと良いでしょう。
様々なソフトウェアが開発可能
上記の例では非常に単純なコンソールアプリを作成しました。もちろんGUIデスクトップアプリケーションの開発も可能です。
紹介したリンク先では、様々なソフトウェアの開発手法が紹介されています。
1.Linux IoT Projects
「Raspberry Pi」で開発を行うためのTipsです。2.How to use the VC++ for Linux with the Intel Edison board
「Intel Edison board」で開発を行うためのTipsです。3.Desktop Applications
Linux向けGUIデスクトップアプリケーションの開発を行うためのTipsです。OpenGLを利用した開発サンプルです。
4.Makefile Project Template
「Makefile」を利用したプロジェクトの設定方法です。IntelliSenseを有効にするには
ソフトウェアのビルド時に使用されるヘッダーファイルの内、「Ubuntu」側にしか存在していないヘッダーファイルはIntelliSenseの対象になりません。これらのヘッダーファイルもIntelliSenseの対象にしたければ、ヘッダーファイルを「Windows」側にコピーし、プロジェクト設定画面の「ソースディレクトリ」にそのディレクトリーパスを追加してください。
多くのパッケージでは、ヘッダーファイルを「/usr/include」フォルダー以下に配置するため、「/usr/include」を「Ubuntu」側から丸ごとコピーすると良いでしょう。
ファイルの配置場所
インストールした開発用パッケージがどこにヘッダーファイルを配置したのか調べるには、以下のコマンドを実行します。
dpkg -L パッケージ名
Clangでコンパイルするには
デフォルトでは、「Ubuntu」のデフォルトのコンパイラーである「GCC」が利用されます。「Clang」でコンパイルするには、プロジェクトの設定を開き「C++コンパイラ」に「clang」を指定します。
また事前に「Ubuntu」側で「clang」パッケージをインストールしておいてください。