Windows環境にてC++をCMake（Visual Studio 2022,VSCode)

# はじめに
この記事では、Ubuntu環境で実装していたC++のCMake環境をWindows環境で再現するための内容です。
ソースコードの記述はVScodeで、CMakeを利用したビルド手順を記します。
Ubuntuと違って、コンパイラの指定や、PATHの管理など、使い勝手が難しく、ライブラリ管理も手こずったので、かなり大変でしたね...
## 前提知識
この記事は、Ubuntu内でのターミナルでC++をコンパイルし、実行ファイルをビルドできていた人向けです。(まあ別にWindowsしか使っていない人でもできるけども...)
内容の引継ぎであったり、再現の問題でWindows環境に導入しなければならない人のための記事です。主に私
## 使用環境
- Windows 10 64bit
- Visual Studio 2022 (Community)
- CMake
- Visual Studio Code

この環境下でのC++実装記事です。多くのC++ with CMakeの記事はコンパイラにVisual StudioではなくMinGWを利用していますね。実際こっちでも動きますし、リソースも少なめなので外でサクッと作りたい人にはおススメです。

しかし、C++でOpenCVやCUDA等、外部のライブラリを利用したいってなってコンパイルを立てるときにMinGWの方が弊害が多くて大変なんす...
そこでMinGWではなくVisualStudioを利用しましょうって感じです。まあ、外国のお偉い方々も比較的VisualStudioを利用してますね。Microsoftが大好きなんだろうなぁ
# 環境の導入
## VSCodeのインストール
VSCodeはとても使いやすいエディタです。どんな言語でも簡単に記述できる上に、コンテナ環境やSSH接続など、Linuxに優しいこともできたりします。
Windows10内で[VSCode](https://code.visualstudio.com/)をダウンロードしましょう。そしてVSCodeを立てましょう。外資やベンチャーに憧れている系は英語のまま使いますね。ですが私は英語が読めないザコなので日本語にします。
この左の3つの□と1つ浮いてるやつ、これをクリック、「japanese」と検索
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2326879/337918da-034a-9b1f-fb1d-fbe4daeb66e9.png)
このJapanese Language Packをインストールしましょう。すると右下らへんにVSCodeを再起動しましょう。って感じのアナウンスが出るので、再起動しましょう。（英語でなんて書いてあったか忘れた。rebootとかrelaunchとかそんなあたりかと）
そうしますと日本語で表記されます。ﾔｯﾀﾈ
### 依存パッケージのインストール
C++ with CMake環境を再現するための依存パッケージをインストールします。画像を参考に以下のパッケージをインストールしてください。
- C/C++
- C/C++ Compile Run
- C/C++ Extention Pack
- C/C++ Themes
- CMake
- CMake Tools
- Code Runner
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2326879/6c770971-4a23-6678-c8f2-d32c48eca554.png" width=250 height=250>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2326879/1781951f-eb19-c3a4-e3ab-3342ce1a87fc.png" width=250 height=250>

## CMakeのインストール
[CMake](https://cmake.org)の右上端のdownloadを選択し、自身のOSのバージョンと同じmsiファイルをWindows内にインストール。そしてアナウンスに従い、ダウンロードします。途中でPATH設定の選択があります。しっかりとチェックしておきましょう。
環境変数から~/CMake/binと設定されていることを確認しましょう。ついでにVSCodeのPATHも通ってるか確認
## VisualStudio Community 2022のインストール
[Visual Studio](https://visualstudio.microsoft.com/ja/downloads/)
oads/)ここで自身の利用するエディションを選択し、インストーラーをインストール、起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2326879/4a02b5b4-9349-9eb5-2552-2eae42f5f7be.png)
私は既にインストールされているので表示されていませんが、Communityを選択し、インストールしました。
### コンポーネントの適用
インストールを選択すると、インストールするコンポーネントの設定ができます。ここでインストール前に一部パッケージを増やします。もし既にVisualStudioを導入している方は「変更」からパッケージをお選びください。
一つ一つ述べてるとめんどくさいので、写真を載せておきます。
- C++デスクトップ開発
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2326879/98f79a98-b408-e813-b2bf-af3a341c65af.png" width=250 height=250><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2326879/9937a4cc-b255-a0b3-b683-9b5f207a45cc.png" width=250 height=250>

- ユニバーサルWindowsプラットフォーム開発
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2326879/e26418b7-da2b-4409-8bbe-f4d0939939c7.png" width=250 height=250>

- C++の埋め込み開発
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2326879/162fb2f2-0fba-b4f5-c44d-068845c02ee5.png" width=250 height=250>

- 個別のコンポーネント（検索して個別に選択する系）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2326879/26a7b56e-c75f-766c-ec01-1b8d0a3abd6f.png" width=250 height=250>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2326879/a4d151c5-992e-ea20-b69b-c31c486452d0.png" width=250 height=250>

ちょっとこのライブラリ近辺の具体的な調査はしていないので、一部不要なものもあると思います...まじわけわかんねぇ
これらチェックの付いているものを選択し、VisualStudioに反映させます。インストールにはかなり時間がかかるので、気長に待ちましょう。

# C++コードプロジェクトの作成
## フォルダを作成してコードを書く
ここまでで事前準備は問題ないですが、VisualStudioのコンポーネント反映のために、一度PCを再起動してから作成しましょう。とりあえずVSCodeを開き、「フォルダを開く」から作成したいプロジェクトフォルダの場所を決めてフォルダを新規作成し、そのフォルダをクリックして、「フォルダの選択」を選択します。
そうしますと、初回に限り信頼問題が発生するので、信頼してあげましょう。寛大ですね。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2326879/15df0aaa-35e6-fcb5-55ff-f4fb786b1383.png" width=250 height=250><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2326879/427382ec-1add-f170-2c16-b791d95f244d.png" width=250 height=250>
私はtestというフォルダを作成しました。左の>を押すとそのフォルダが展開されます。上のアイコンからファイル、フォルダを作成可能です。(右クリックも可)これで晴れて、VSCode内でプロジェクトができたというわけですね。
このようなフォルダ階層が出来上がりました。
```
test__...
   |__Code__
      |__src.cpp
   |__build
   |__CMakeLists.txt
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2326879/a838387e-c97a-54a6-e4c0-51e0d055b8b2.png" width=250 height=250>

それぞれのテキストはこんな感じ
```:CMakeLists.txt
#CMakeの最低保証バージョン
cmake_minimum_required(VERSION 3.1.0)
#プロジェクト名指定
project(test)
set(CMAKE_EXPORT_COMPILE_COMMANDS 1)
include(CheckCXXCompilerFlag)
#ソースコードのフォルダ指定（階層別の方が管理が楽）
set(cpp_code ${CMAKE_CURRENT_SOURCE_DIR}/Code/src.cpp)
#コンパイラ指定
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
if(COMPILER_SUPPORTS_CXX11)
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c11")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
elseif(COMPILER_SUPPORTS_CXX11)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
endif()
#プロジェクトの作成
add_executable(${PROJECT_NAME} ${cpp_code})
include_directories(${PROJECT_NAME} ${ADDITITONAL_INCLUDE_DIRS})
set_target_properties(${PROJECT_NAME} PROPERTIES FOLDER Examples)
#ビルド設定
install(
    TARGETS
    test
    RUNTIME DESTINATION
    ${CMAKE_INSTALL_PREFIX}/bin
)
```
```:src.cpp
#include <iostream>
using namespace std;
int main()
{
  cout << "Hello World" << endl;
  return 0; 
}
```
これらはVSCode左上、ファイル(F)の「保存」で開いているファイルを、「すべて保存」で変更内容全てを保存できます。
## CMakeの準備
ファイルを保存したらCMakeのセットアップを行います。
表示(V)からコマンドパレットを選択するか、Ctrl+Shift+Pでコマンドパレットを起動します。
CMakeを入力し、「CMake クイックスタート」を実行
ここで、CMakeで利用するコンパイラのキットが聞かれます。「Visual Studio Community 2022 Release -x86_amd64」を選択
もし出てこない場合はコマンドパレットで「CMake キットの選択」から「scan for kits」でキットを検出します。
#### これでもキットが出ないとき
しかたがないのでキットを無理やり設定します。
エクスプローラーにて
```
C:\Users\[ユーザー名]\AppData\Local\CMakeTools
```
を開きます。AppDataは隠しファイルですので、表示の有無を設定しましょう。
この中のcmake-tools-kits.jsonに以下を設定（無い場合は新規作成）
```:cmake-tools-kits.json
[
  {
    "name": "Visual Studio Community 2022 Release - x86_amd64",
    "visualStudio": "28eae86e",
    "visualStudioArchitecture": "x86",
    "isTrusted": true,
    "preferredGenerator": {
      "name": "Visual Studio 17 2022",
      "platform": "x64",
      "toolset": "host=x86"
    }
  }
]
```
カッコの位置とか気を付けてね。
保存して、VSCodeを開きなおし、キットの選択をしたら出てくるのではないでしょうか。
## C++のビルドと実行
VSCodeにターミナルの欄があるので、ターミナルを起動
```
cd build
```
でbuildディレクトリに移動します。これをやっておくと構成ファイルがbuild内にまとまるから綺麗になるよ
```
cmake ..
```
下の階層のCMake検証を行います。~have been written!って書かれていればOK
```
cmake --build .
```
これでビルドをします。無事ビルドが成功したらbuild/Debug内にtest.exeが出来ているはず
```
cd Debug
./test.exe
```
これで「Hello World」が実行後にターミナルに表示されれば成功です！お疲れさまでした。

お時間あるときに外部ライブラリ（OpenCV、CUDA）の実装記事を書けたらなと思います。