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

Pocket

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


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

 

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

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

 
 

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

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

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

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

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

  • 開発機: Windows 10 Home 64bit / Visual Studio 2015 Community
  • Linux: VMWare Player上で動いてるUbuntu 16.04LTS 64bit

 
 

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

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

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

 
 

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

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

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

 

create_makefile_project

 

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

 

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

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

 

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プロジェクトは公開して間も無い機能ですから、たぶん今後はもっと便利になるんじゃないかなーと思います。

「Visual StudioでLinux向けにMakefileプロジェクトを作ってリモートビルドする」への4件のフィードバック

  1. すみません、質問なんですがこのMakefileはプロジェクトに追加すればいいんでしょうか?
    Makefileをプロジェクトに追加し、ビルドしてみたんですがリモート側に転送されず、makeがこけてしまいます。

    1. 質問ありがとうございます。

      まずMakefileはプロジェクトに追加するという認識で間違いありません。

      Makefileがリモート転送できなかったのはファイルのプロパティ設定が原因だと思われます。
      Makefileをソリューションエクスプローラで選択し、VSのペーンで表示されるプロパティ画面で次のように設定してみてください。

      ・「プロジェクトに含まれる」が「True」になっていることを確認
      ・「ファイルの種類」を「メイクファイル」にする

      手元環境では上記の設定でいけますが、もし上記の設定でもダメな場合「コンテンツ」も「True」にしてみてください。

      1. 返信ありがとうございます。
        教えて頂いた設定は試していたのですがやはり転送されませんでした。
        ですが、転送される条件があるのかと思い、いろいろ試したところ原因と思わしき箇所が分かりました。

        Makefileを追加する際、「新しい項目」にMakefileが無かったため、テキストファイルを追加した後、ファイル名とプロパティを変更していました。
        この手順で追加を行うと、vcxprojファイル上は以下の様に追加され、どうもこれが原因で転送されなかったようです。

        ===================================

        Makefile

        ===================================

        次にC++ファイルとして追加し、ファイル名とプロパティを変更すると以下のようになり、この状態では転送が行われました。

        ===================================

        Makefile

        ===================================

        どうもありがとうございました。

        1. タグが消えてしまったのでもう一度

          NG
          ===================================
          <ItemGroup>
          <ClCompile Include=”main.cpp” />
          </ItemGroup>
          <ItemGroup>
          <Text Include=”Makefile”>
          <FileType>Makefile</FileType>
          </Text>
          </ItemGroup>
          ===================================

          OK
          ===================================
          <ItemGroup>
          <ClCompile Include=”main.cpp” />
          <ClCompile Include=”Makefile”>
          <FileType>Makefile</FileType>
          </ClCompile>
          </ItemGroup>
          ===================================

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です