マルチプラットフォームC++プロジェクト作成 01

# はじめに
マルチプラットフォーム対応のC++アプリを作成するとき、
大体CMakeを使用すると思います。

CMakeの一般的な使い方として、
WindowsではVisual Studioのソリューションを作成してビルドし、
LinuxではMakeFileを生成してビルド(make)します。

各プラットフォームでこれを行うのが面倒で、、、
どうにかVisual Studio内で完結できないものかと調べたところ、
Visual StudioのCMakeプロジェクトを使うことで一旦解決できました。

今回は、[miniaudio](https://miniaudio.docsforge.com/)というマルチプラットフォーム対応の
音声再生ライブラリをVisual Studio経由で実行できることを確認ましたが、
その中でまずプロジェクトの設定方法について紹介します。

# 目次
[1. 開発環境](#1-開発環境)
[2. CMakeプロジェクトの作成](#2-cmakeプロジェクトの作成)
[3. Linux ビルド/実行](#3-linux-ビルド実行) 

# 1. 開発環境
私の実施した環境は以下です。

| 項目| 詳細|
|:--|:--:|
|Windows10(ホストOS)|-|
|Visual Studio 2019|16.11.9|
|CMake|3.22.1|
|VirtualBox|6.1.28|
|Ubuntu(仮想環境のゲストOS)|20.04.3|

# 2. CMakeプロジェクトの作成

### Visual Studio の準備
Visual Studio   Installerを起動して、「C++によるLinux開発」をインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515183/3c2fb91a-92cc-4629-f7ab-ac6b111f6512.png)　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515183/296641d1-77ae-1b10-b519-a024180a2db8.png)

### プロジェクトの作成<br>
新しいプロジェクトの作成 > CMakeプロジェクト
これでプロジェクトを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515183/df0700e1-7e02-1995-126f-2b48fad90c5e.png)

sampleというプロジェクト名で作成、実行してみました。
フォルダ構成は以下のようになっており、CMakeList.txtが2つできるのが特徴ですね。

```
sample ←プロジェクトTOP
  ├.vs    
  ├sample
  │  ├CMakeLists.txt ← ソースファイル記載したCMakeプロジェクトの本体
  │　├sample.cpp
  │　└sample.h
  └CMakeLists.txt ← CMakeプロジェクトのTOP
　  ↑ここから下層のCMakeList.txtを参照している
```

また、通常のソリューションと異なり、
ソリューションエクスプローラで「フォルダビュー」と「CMakeターゲットビュー」の表示方法が選択できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515183/1d926e94-12c7-a166-7e2c-1be76c7d46f6.png)

### プロジェクトの実行(Windows)

ソースファイルの内容は自動生成から変えていないので、割愛しますが、
スタートアップアイテムの設定をして、F5でいつもどおりデバッグ実行ができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515183/20851359-9026-a2d5-840c-98286de1da5a.png)

```:実行結果
Hello CMake.
```

# 3. Linux ビルド/実行
少し長いですが、Linuxでビルドするための設定を行います。

### CMakeの設定にLinux Build設定を追加する
※以下の手順は「フォルダビュー」の表示状態で行います!!

プロジェクトTOPのCMakeList.txtを右クリックして、
プロジェクトのCMake設定を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515183/81ee49a1-bd0b-a64a-fdee-3befe67dd67e.png)

CMake設定の構成に「Linux-GCC-Debug」を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515183/0e68d15e-15ac-7349-eda0-d3711ce81938.png)

※初回の設定時、プロジェクトに```CMakeSettings.json```が生成されますが、
　これがGUIで設定した本体になります。jsonをエディタ等で編集することでも設定変更できます。

### リモートマシンの設定
仮想環境のLinuxに対してSSHでアクセスするための設定を行います。
前の手順と同じく「CMakeの設定」画面にある、リモートマシン名をdefaultから変更します。

初回はdefault以外設定がないため、
ツール > オプション > クロスプラットフォーム > 接続マネージャから
仮想環境(ゲストOS)の接続設定を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515183/2cc02123-7bee-f05e-a184-c022cf44462e.png)

設定後、「CMakeの設定」からリモートマシン名を設定して保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515183/68216f05-854d-ed93-5fb1-a588e47b729a.png)

### サンプルアプリの実行
仮想環境を起動します。
次に構成を「Linux-GCC-Debug」に変更して、F5で実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515183/b70fe544-b3f0-2a73-6f0b-184485646c80.png)

Linuxコンソールウィンドウに結果が表示されれば、成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515183/d37d20cb-ae2d-9d0a-b710-70563ffe4793.png)

本稿は仮想環境でGCCコンパイルができることと、SSH接続ができることをベースに記載しているので、
わからないことがあったら別途調べてみてください。
(簡単に検索できるはずです!!!)

# 終わり
これでVisual Studioから移動せずに各プラットフォームのビルド/実行が可能になりました。
ここまではサクサク進むことができたのですが、miniaudioはちょっと手こずりました、、、
次回で、miniaudioをビルドする上で困ったことやコマンドライン引数をどのように設定するかなど紹介します!!!

# 参考
[Visual Studio で CMake Linux プロジェクトを作成する](https://docs.microsoft.com/ja-jp/cpp/linux/cmake-linux-project?view=msvc-170)
[Visual Studio でターゲットの Linux システムに接続する](https://docs.microsoft.com/ja-jp/cpp/linux/connect-to-your-remote-linux-computer?view=msvc-170)