Bakulog

獏の夢日記的な何か。

Visual StudioでLinux向けにMakefileプロジェクトを作ってリモートビルドする

初歩的なとこで突っかかったのでメモ程度に。


本記事ではVisual StudioプラグインであるVisual C++ for Linux Developmentに最近追加された機能を紹介します。

 

まずVisual C++ for Linux Developmentとは何かという話ですが、これは名前の通りVisual StudioLinux向け開発をサポートするプラグインです。

プラグイン自体は以前から公開されていて、クロスコンパイルに関する方法の解説記事が上がっていたりします。

   

さて。ここからが本題ですが、2016年8月19日に同プラグインではMakefileプロジェクトが新たにサポートされました。

Makefileプロジェクトではクロスコンパイルではなくリモートマシン上でビルドを行えるため、たとえば

手元に今までLinux上で開発、コンパイルデバッグしていたコードがあるけど、本当は編集とデバッグVisual Studioでやりたい…

といったシチュエーションに対してMakefileプロジェクトは効果的な解決策と言えます。

そこで本記事では実際にMakefileプロジェクトの作成からデバッグ実行までの流れを追ってみます。手元の動作確認環境は以下の通り。

   

最初はクロスコンパイルを通してみる

最初にプラグインのインストールやLinux機への接続など基本的な手順を試すため、Visual C++ for linux Development を軽く使ってみた等を参考にクロスコンパイルが通ることまで確認します。

ちなみに上記記事に沿って作業を進めていく中で接続先Linuxの設定をする手順がありますが、接続先の設定は後から「ツール>オプション>Cross Platform」で変更することができます。

   

Makefileプロジェクト作成からデバッグ実行まで

ロスコンパイルが通ることを確認したら本題のMakefileプロジェクトを試します。

まず新規ソリューションとして「他の言語>Visual C++>クロス プラットフォーム>Makefile Project(Linux)」を選択して適当にプロジェクトを作成。

 

create_makefile_project

 

空のプロジェクトが作られるので最低限のmain.cppMakefileを追加。

//main.cpp
#include <iostream>

int main(void)
{
    std::cout << "Hello\n";
    return 0;
}
#Makefile
all: main.o
    g++ -o main main.o

main.o: main.cpp
    g++ -c -g -O0 main.cpp

clean:
    rm -f main main.o

 

ひとまずこれでビルドしてみるとビルド成功が表示されますがこれは実際にはビルドできてません

出力を見るとビルドコマンドが未設定だから何もしてないよという主旨のことが書かれています。

 

build_command_not_configured

 

つまり現状ではソースをリモートマシンに投げつけただけで処理が終わっています。そこで「プロジェクト>(プロジェクト名)のプロパティ>Remote Build」を選択し、ビルドコマンドや出力先ファイルを設定します。

 

build_command_bad_pattern

 

これでビルドすると今度はビルドに失敗します。なんでや!

 

makefile_failed

 

予想外の展開に社畜ちゃんも固まってますが、ここで焦ってはいけません。私はMakefileについてはほぼ素人なので、単純にMakefileを書き間違えたのかもしれません。

 

問題を切り分けるため、いったんリモートマシン側でプロジェクトディレクトリに行って現場を覗いてみます。リモートのプロジェクトディレクトリはデフォルトでは(ホームディレクトリ)/projects/(プロジェクト名)/です。

 

remote_env_ok

 

普通に動いてますね…。

 

ソース自体は問題ないとなればVisual Studio上での設定が不足していることになります。ここで直感としてリモートマシンの作業ディレクトリ設定が不足しているのでは?という疑問が浮かんだため、ビルドコマンドにpwdを追加してみます。

 

pwd_before_build

 

結果がこちら。

 

pwd_check

 

作業ディレクトリはリモートマシン側のプロジェクトディレクトリではなく/home/(ユーザ名)つまりただのホームディレクトリでした。これではビルドできるハズがないためビルドコマンドを修正します。

 

makefile_command_with_cd

 

プロジェクトディレクトリの書き方については「プロジェクト>(プロジェクト名)のプロパティ>Remote Settings>Remote Project Directory」からコピペすればOK。

これでブレークポイントを設定して実行したところ、ようやく動きました。

 

makefile_debug_success

   

まとめ

トラップが多かった気もしますが、設定さえきちんとすればリモートビルド+デバッグが出来ることが確認できました。Makefileプロジェクトは公開して間も無い機能ですから、たぶん今後はもっと便利になるんじゃないかなーと思います。