WindowsでC++
自分用にメモしておきます。
以下のようなWindows10でC++をコンパイルして実行出来る最低限の環境を作ります。
Windows10上でインストーラを使ってインストールする物は極力減らす方針です。
- Windows10でC++をコンパイルして実行できる
- Visual StudioとかのIDEは覚える事が多いので出来ればシンプルにしたい
- Makeも使える方が嬉しいしGitも使ってみたい
作る環境
- Windows10
- Visual Studio Code (VSCode)
- MSYS2
以上の3要素でC++を最低限コンパイル出来る環境を目指す。
ターミナルとかGitとかMakeとかはMSYS2の物を使う。
Visual Studio Code (VSCode)をインストール
ダウンロードして画面に従いインストールを行う。
MSYS2をインストール
ページ上部からmsys2-x64_86-(date).exe
をダウンロードし、ページの手順に沿ってインストールを行う。
MSYS2 MSYSを起動してパッケージを更新する。
$ pacman -Syu
途中でMSYS2を再起動する事になるので再起動した後に以下で残りを更新する。
$ pacman -Su
MSYS2で以下のコマンドを実行しC/C++環境に必要なパッケージを入手する。
$ pacman -S mingw-w64-x86_64-gcc mingw-w64-x86_64-gdb make git
ここまでやるとMSYS2上でgccが使えるようになっていると思うので、MSYS2で以下を実行してテストする。
$ gcc -v
$ make -v
$ git --version
正しく実行出来るとバージョン情報が表示される。
ホームディレクトリの設定
デフォルトではMSYS2のホームディレクトリはC:\msys64\home\ユーザー名
に設定されている。
ホームディレクトリの変更自体はexport HOME=/C/Users/ユーザー名
すれば良いが、OpenSSHの鍵の参照先が$HOME/.ssh/
ではなくて/home/ユーザー名/.ssh/
を直接参照するため、別の手段を設定する必要が有る。
そこで、今回はWindows10の付属機能でC:\msys64\home
からC:\Users
へシンボリックリンクを貼る。
事前にC:\msys64\home\ユーザー名
の中身をC:\Users\ユーザー名
に移動して、C:\msys64\home
ディレクトリを削除しておく。
$ mklink /D C:\msys64\home C:\Users
他には/etc/fstab
を書く方法が有るらしいが今回はこれで。
VSCodeでMSYS2のGitを使えるように下準備
C:\msys64\usr\bin\git-wrap.bat
に以下を記述して保存する。
@echo off
setlocal
rem If you don't add path for msys2 into %PATH%, enable following line.
rem set PATH=c:\msys64\usr\bin;%PATH%
if "%1" equ "rev-parse" goto rev_parse
git %*
goto :eof
:rev_parse
for /f %%1 in ('git %*') do cygpath -w %%1
VSCodeの設定
設定ファイルを開く
Ctrl + Shift + P
でコマンド検索欄を出す。
opensettings
とか入力するとPreferences: Open Settings (JSON)
が見つかるので選ぶとsettings.json
が開かれる
設定の追記
ファイルを以下のように編集する。既に何かあるならカッコやカンマとか構造を壊さないように追記する。
特に最初と最後のカッコ{...}
を忘れないように。
{
// VSCodeで使うターミナルの設定
"terminal.integrated.shell.windows": "C:/msys64/usr/bin/bash.exe",
"terminal.integrated.env.windows": {
// inheritにする事でWindows10のPATHを引き継ぐ
// 引き継がない場合はコメントアウト
"MSYS2_PATH_TYPE": "inherit",
"MSYSTEM": "MINGW64",
"CHERE_INVOKING": "1"
},
"terminal.integrated.shellArgs.windows": [
"--login"
],
"terminal.integrated.cursorStyle": "line",
// Gitのパスの設定(先ほど作ったバッチファイルを読み込むように)
"git.path": "C:/msys64/usr/bin/git-wrap.bat"
}
以上のようにするとVSCode上でTerminal -> New Terminal
で開いたターミナルがMSYS2 MINGW64になる。
コンパイルと実行
コンパイルに必要なg++
コマンドとかmake
コマンドとかが使えるようになっているはずなので後はプログラムを書くだけ。
一応、基本的なC++プログラムとそれをmakeするためのMakefile
を書いておく。
#include <iostream>
using namespace std;
int main() {
cout << "Hello, World !" << endl;
return 0;
}
hello_world: hello_world.cpp
g++ -o hello_world.exe hello_world.cpp
clean:
rm hello_world.exe
上記2つのファイルを適当なディレクトリに保存して実行を行う。
# g++コマンドを直接使う
$ g++ hello_world.cpp
$ ./a.exe
Hello, World !
$ rm ./a.exe
# makeコマンドを使ってみる
$ make
g++ -o hello_world.exe hello_world.cpp
$ ./hello_world.exe
Hello, World !
$ make clean
rm hello_world.exe
これで、とりあえずC++のプログラムをコンパイルして実行出来る環境が完成した。
(余談)コマンドプロンプトでgccを使いたい場合
MSYS2のターミナルでは予めMinGWのbinへPATHが通っている。
Windows10のコマンドプロンプトで使う意にはWindows10のPATHにMinGWのbinを追記する必要が有る。
イメージ的には、入力されたコマンドを探すフォルダを追加している感じ。
コマンドプロンプトを管理者権限で実行して以下のコマンドで環境変数PATHに追記する。
管理者権限モードで起動した場合は割と何でも出来てしまうので注意する。
間違えそうな人は普通にWindowsの設定-システム -> バージョン情報 -> システム情報 -> 設定の変更 -> 詳細設定 -> 環境変数(N)...
からシステム環境変数
のPath
を編集して最後にC:\msys64\mingw64\bin
とC:\msys64\usr\bin
を追加しても良い。
$ setx /M PATH "%PATH%;C:\msys64\mingw64\bin;C:\msys64\usr\bin"
(余談)MSYS2とMINGW64とMINGW32の違い
gccにMSYS版とMINGW64版が有るが違いがよく分からなかったが参考文献によると以下のためらしい。
MSYS2とMinGW64の最大の違いは、POSIXエミュレーションを介しているか否か。
--- MSYS2,MinGW64,Cygwinの違い
MSYS2とMINGW64でターミナルが2種類用意されてるのはそんなに違いは無くて、MINGW64ではC:\mingw64\bin
にパスが通っているだけ。
参考文献
MSYS2 MinGW GCC環境をつくる(その1)
Visual Studio Code 15.1の統合シェルをMSYS2のbashにする
[FYI] Using git on msys2 #4651
msys2での$HOMEとOpenSSHでのホームディレクトリの違い
Windows10でシンボリックリンクを設定する方法
MSYS2,MinGW64,Cygwinの違い