Windows 10 + vscodeでのC/C++言語開発環境の構築（gcc+gdb または clang + lldb）

# 動機
- 講義で使用予定のVisual Studio Code 1.49.1 + C/C++ 機能拡張 1.0.0 + msys2(20200903)環境でのgdbによるデバッグがある日突然エラーで動かない問題に遭遇．
- いずれ本家で対処される問題かもしれないし，対処されないかもしれないし，そもそも自分の環境がおかしい可能性もある．
- めんどいのでclang + lldbで行くことにした．
- 主に学生さん向けの情報です．一般的に価値があるかは読む人次第．
- **(2021/4/6追記)上記問題が解決されているようなのでgccとgdbを使う場合についても書いた．**



# 注意
- ウイルスバスター，マカフィーインターネットセキュリティ，ノートンなどのセキュリティソフトを無効化しておく．特に，ファイル保護，リアルタイムスキャンなどの機能は必ずOFFに．ウイルスバスターのように監視対象のフォルダの例外設定が可能な場合，`C:\tools`フォルダを例外に設定しておきます．Cドライブ直下に`tools`フォルダがないと設定できない場合には，自分で作成しておく．
- Windowsのログオンユーザ名が半角英数字だけであることを確認すること．
- 32bit版OSは対象外です．これを機に64bit版OSにすることを推奨します．

# 0. お約束
- 「エクスプローラー」とは，Windowsのファイルマネージャソフトです．スタートメニュー -> Windowsシステムツールの中にあります．
- Cドライブとは，エクスプローラの左ペインにある「PC」を展開したときに現れる，`〜適当な名前（Windowsとかローカルディスクとか）〜(C:)`という名前のディスクです．通常，Windowsはここにインストールされています．
- キーボードショートカットは「Ctrl + Shift + X」などと記述します．意味は「CtrlキーとShiftキーを押しながら，Xキーを押」すということです．

# 1. chocolateyのインストール
1. スタートメニュー -> Windows PowerShell -> 「Windows PowerShell」アイコンを右クリックし，「管理者として実行」をクリックし，「管理者: Windows PowerShell」ウインドウを開く．「このアプリが〜許可しますか」の質問には当然だが「はい」と答えます．**コマンドの入力を待っている状態では，カーソルが点滅している**のが分かる．

1. 以下のコマンドをコピーし（コマンドの上にマウスカーソルを移動し，出てくるコピーボタンをクリック），1-1.で開いたウインドウにペースト(Ctrl + V)し，Enterキーを押す．

1. 赤い文字のエラー表示が出ずに，カーソルが点滅する入力待ち状態になればインストール終了．ウインドウを閉じます．

```PowerShell:
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
```
# 2. 環境変数の設定
1. 手順1-1をを繰り返して，「管理者: Windows PowerShell」ウインドウを開く．

1. 以下のコマンドをコピー&ペーストし，Enterキーを押す．

```PowerShell:
setx PATH "$env:path;C:\tools\msys64\mingw64\bin"
```

1. 以下のコマンドをコピー&ペーストし，Enterキーを押す．

```PowerShell:
setx PATH "$env:path;C:\tools\msys64\usr\bin"
```

PowerShellのウインドウは閉じても大丈夫です．

# 3. msys2のインストール
1. 1-1の手順を繰り返して，「管理者: Windows PowerShell」ウインドウを開く．

1. 以下のコマンドを手順1-2と同様にコピー&ペーストしてEnterキーを押す．途中英文の質問が表示される場合にはAと入力してEnterキーを押します．**回線速度や，サーバの混雑度によって時間がかかりますが，途中で終了しないように．**以下のスクリーンショットのように，入力待ち状態になるまでに，赤い文字が表示されなければ終了（ただし，一瞬赤字が表示されることがあります．これは無視しても大丈夫です．）．セキュリティソフトが動いているとこの手順で失敗します．

```PowerShell:
choco install msys2 -y
```

![スクリーンショット 2020-09-22 10.42.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98153/c64f979d-b1c8-04ae-0c7e-1fac958a224d.png "msys2インストール完了後の画面")

# 4. msys2のターミナルを開く
1. 1-1の手順を繰り返して，「管理者: Windows PowerShell」ウインドウを開く．

1. 以下のコマンドを入力しEnterキーを押す．msys2のターミナルが開きます．

```PowerShell:
C:\tools\msys64\mingw64.exe
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98153/ca4657ae-38ce-de10-c8ed-fc9761036d17.png" width="60%"/ title="msys2のターミナル"/>

## (2023-03-23追記)キーリングをアップデートします．

```Bash
pacman -Sy msys2-keyring && pacman -Su
```

# 5. コンパイラとデバッガのインストール
Visual Studio Codeそれ自体には，C/C++言語のコンパイラは含まれていませんので，別途インストールします．ここで，コンパイラとデバッガ（デバッグ作業を行うためのソフトウェア）の選択肢が2つあります．どちらを選んでも基本的な機能は変わりません．gccとgdbの組み合わせのほうが，Pythonをインストールするという工程がない分，簡単かもしれません．

## 5.1 `gcc`と`gdb`を使う場合
### 5.1.1 `gcc`と`gdb`のインストール
 手順3-2で開いたmsys2のターミナルにて，以下のコマンドをコピー＆ペーストして，Enterキーを押す．**ただし，ペーストするには，msys2のターミナルウインドウ上で右クリックを押し，表示されるコンテキストメニューから「Paste」をクリックします．**途中，「インストールしますか？」などの質問が表示された場合には，そのままEnterキーを押してください．ダウンロードとインストールには，それなりの時間(サーバが混んでいるときには1時間以上)がかかります．

```shell:
pacman -S mingw-w64-x86_64-gcc mingw-w64-x86_64-gdb mingw-w64-x86_64-cmake make git
```
**vscodeをインストール&設定する場合のみ手順6につづく**

## 5.2 `clang`と`lldb`を使う場合
### 5.2.1 `clang`と`lldb`のインストール
 手順3-2で開いたmsys2のターミナルにて，以下のコマンドをコピー＆ペーストして，Enterキーを押す．**ただし，ペーストするには，msys2のターミナルウインドウ上で右クリックを押し，表示されるコンテキストメニューから「Paste」をクリックします．**途中，「インストールしますか？」などの質問が表示された場合には，そのままEnterキーを押してください．ダウンロードとインストールには，それなりの時間(サーバが混んでいるときには1時間以上)がかかります．待っている間に次の手順を実行しても構いません．インストール完了時には以下のスクリーンショットと同じ表示になるはずです．

```shell:
pacman -S mingw-w64-x86_64-clang mingw-w64-x86_64-lldb
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98153/7481c3b2-b539-ec14-cd93-455e05325dc6.png" width="75%"/>

### 5.2.2 Pythonのインストール
1. https://www.python.org/ftp/python/3.8.6/python-3.8.6rc1-amd64.exe を例えば「ダウンロード」フォルダにダウンロードします．ダウンロードしたインストーラをダブルクリックして実行します．

2. 以下のスクリーンショットにしたがって，インストール作業を進めます．

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98153/2672f270-edb4-9798-95ab-738dd2994238.png" width="75%"/>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98153/92aa47cd-0123-9ab2-406d-8c199439b174.png" width="75%"/>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98153/c5507db2-6c02-c9ba-f1b8-5ea15a5e8bef.png" width="75%"/>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98153/b5c381d2-675a-2033-e738-ebcbd68e575d.png" width="75%"/>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98153/334228fd-201a-0ff7-488f-30a41b6b6e34.png" width="75%"/>

# 6. Visual Studio Codeのインストール
1. 1-1の手順を繰り返して，「管理者: Windows PowerShell」ウインドウを開く．

1. 以下のコマンドをコピー&ペーストし，Enterキーを押す．しばらくすると，デスクトップにVisual Studio Codeのショートカットが見えるはず．見えたら完了．参考までに完了時のPowerShellウインドウの表示は以下のスクリーンショット参照．

```PowerShell:
choco install vscode -y
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98153/86b2ef11-cf5a-b087-f13b-50ca98251bd4.png" width="75%"/>

# 7. Visual Studio Codeの設定1
1. エクスプローラーを開き，Alt + Dを押す．Backspaceキーを押し続け，見えている文字を消す．そこに，`C:\Users`と入力してEnterキーを押す．表示されたフォルダから，自分のユーザ名をフォルダを探して，ダブルクリックする．さらに「ドキュメント」あるいは「Documents」フォルダを探し，ダブルクリックする．そこに新しいフォルダ「Progs」（名前は講義によって違う可能性がある）を作成する．すでにProgsフォルダが存在する場合，既存のフォルダの名前を「Progs_old」などに変更しておく．

1. デスクトップのVisual Studio Codeのショートカットをダブルクリックして，vscodeを起動する．

1. Ctrl + Shift + X を入力し，`japanese`とタイプする．一番上位の候補「Japanese Language Pack for〜」の右下に見える緑色の`Install`ボタンを押す．

1. タイプした`japanese`を消して，`C/C++`とタイプ．一番上位の候補「C/C++」の右下に見える緑色の`Install`ボタンを押す．

1. (**この手順は4.2 clangとlldbを使う場合を選択した場合のみ必要**)タイプした`C/C++`を消して，`CodeLLDB`とタイプ．唯一の候補「CodeLLDB」の右下に見える緑色の`Install`ボタンを押す．インストールには少し時間がかかる．

1. vscodeウインドウの右下に`In order to use VS Code in Japanese, VS Code needs to restart`が見えているはず．`Restart Now`ボタンを押す．

1. Ctrl + K + Oを押し，手順7-1で作成したフォルダを開く．

1. Ctrl + Nを押し，新しいファイル作成する．`Untitled-1`という新しいファイルが開く．Ctrl + Sを押し，新しいファイルを`test.c`という名前で保存する．

1. 以下のコードをコピーし，`test.c`にペーストする．Ctrl + Sを押して保存．一度vscodeを閉じる．

```C:
#include <stdio.h>

int main() {
  int a = 10;
  printf("a = %d\n", a);
}
```

# 8. Visual Studio Codeの設定2（tasks.jsonの生成）

1. vscodeを起動．Ctrl + Sfhit + Pを押す．`edit config`と入力し，候補の「C/C++: 構成の編集(UI)」をクリック．

1. 「コンパイラパス」にあるドロップダウンリストを展開し，候補の中から`C:/tools/msys64/mingw64/bin/clang.exe`を選択．

1. 下に少しスクロールし，IntelliSenseモードのドロップダウンリストを展開し，候補の中から`clang-x64`を選択．

1. `test.c`ファイルのタブに移動し，Ctrl + Shift + Bを押す．画面中央上部に出てくる候補の中から，`C/C++: clang.exe build active file`は**クリックせず**，にマウスカーソルをあわせ，右側に表示される歯車アイコンをクリックする．`tasks.json`ファイルが自動作成される．自動作成された内容を，以下の内容と置き換える．コンパイラとデバッガの選択で5.1と5.2のどちらを選択したかで置き換えるべきtasks.jsonの内容が変わるので注意．

### 「5.1 gccとgdb」を選択した場合
```json:tasks.json
{
	"version": "2.0.0",
	"tasks": [
		{
			"type": "shell",
			"label": "C/C++: gcc.exe build active file",
			"command": "C:/tools/msys64/mingw64/bin/g++.exe",
			"args": [
				"-g",
				"-fexec-charset=CP932",
				"${file}",
				"-o",
				"${fileDirname}\\${fileBasenameNoExtension}.exe"
			],
			"options": {
				"cwd": "C:/tools/msys64/mingw64/bin"
			},
			"problemMatcher": [
				"$gcc"
			],
			"group": "build"
		}
	]
}
```
### 「5.2 clangとlldb」を選択した場合
```json:tasks.json
{
	"version": "2.0.0",
	"tasks": [
		{
			"type": "shell",
			"label": "C/C++: clang.exe build active file",
			"command": "C:/tools/msys64/mingw64/bin/clang.exe",
			"args": [
				"-g",
				"${file}",
				"-o",
				"${fileDirname}\\${fileBasenameNoExtension}.exe"
			],
			"options": {
				"cwd": "C:/tools/msys64/mingw64/bin"
			},
			"problemMatcher": [
				"$gcc"
			],
			"group": "build"
		}
	]
}
```

# 9. Visual Studio Codeの設定3（launch.jsonの作成）
1. `test.c`ファイルのタブに移動し，F5キーを押すか，メニューの「実行」->「デバッグの開始」を選択．「環境の選択」候補の中の`LLDB`を選択．`Cannot start debugging because no launch configuration has been provided`エラーが出るが，気にせずOKを押す．

1. `launch.json`ファイルが開く．その中身を以下のコードと置き換える．（Ctrl + Aを押した後，Backspaceキーを押して全て削除し，コピー&ペースト）

### 「5.1 gccとgdb」を選択した場合
```json:launch.json
{
    // IntelliSense を使用して利用可能な属性を学べます。
    // 既存の属性の説明をホバーして表示します。
    // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) 起動",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "c:\\tools\\msys64\\mingw64\\bin\\gdb.exe",
            "setupCommands": [
                {
                    "description": "gdb の再フォーマットを有効にする",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "C/C++: gcc.exe build active file"
        }
    ]
}
```
### 「5.2 clangとlldb」を選択した場合
```json:launch.json
{
    // IntelliSense を使用して利用可能な属性を学べます。
    // 既存の属性の説明をホバーして表示します。
    // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "type": "lldb",
            "request": "launch",
            "name": "Debug",
            "program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
            "args": [],
            "cwd": "${workspaceFolder}",
            "preLaunchTask": "C/C++: clang.exe build active file"
        }
    ]
}
```

# 10. ブレークポイントとデバッグ実行
1. `test.c`ファイルが表示されているタブに移動する．なお，その他のタブは閉じてしまって構いません．

1. ソースコードの5行目をクリックした後，Shift + F9キーを押すか，行番号の左側をクリックして赤い丸を点灯させる．この作業はブレークポイントを設定しています．ブレークポイントとは，プログラムの実行を一時停止する場所のことです．デバッガを用いた実行では，ブレークポイントのついた行を実行する直前で，プログラムの実行が止まります．このとき，ローカル変数などの値を確認することができます．

1. F5キーを押すか，メニューの「実行」->「デバッグの開始」を選択．5行目でプログラムの実行が一時停止したらOKです．

1. Shift + F5キーを押すか，メニューの「実行」->「デバッグの停止」を選択して終了．

以上．