目次
VisualStudioCode と MSYS2(mingw64) での環境構築
以下は、一応自分が試行錯誤した時用のメモとして残すが、あまり参考にしてはいけない。
Windows上でのC++(単なる愚痴)
C++は個人的には使う機会が少ないが、いざという時に使えるようにはしておきたい。
しかし、WindowsでのC++環境構築はなかなか一筋縄ではいかない。
ネット上に情報は一見豊富にあるように見えて、取捨選択に理解と経験が要るという感想。
- 新旧の情報の混在
- IDE、互換レイヤー、コンパイラ、ビルドシステムなど関連ツールの理解と、選択肢の多さと、更新の速さ
があるので、以下のようにハマりがちになる。
- 基礎的な環境構築方法について書かれた記事を参考にして構築する
- Hello World はとりあえず動く
- →ライブラリなど、追加的な機能についての記事を探す
- →最初の記事とツールが違っていたり、自環境とバージョンが合ってなかったりする
- →気付かず参考にすると簡単にエラーになる
ということで、自分の環境に適応できる記事というのは、案外少ない。少ないだけならいいのだが、“一見できそうに見える記事”が出てくるのが悩ましい。全体のツール構成を理解して「ここが違っていたら参考にできない」というクリティカルな部分が分かっていれば良いのかも知れないが、リテラシーが求められる。
各ツールの概要と選択
ツールチェインの選択
ツールチェインとは、コードからEXEを生成するのに必要な処理一式を連鎖的に行うツール群である。コンパイルとかアセンブルとかリンクとか、ひとえにビルドと言ってもいろいろ裏でやってるらしい。
いくつかの選択肢があり、体感的にはあまり差は無いが、機械語の最適化度合いや、細かなバグの発生箇所などは違う場合があるようだ。
- Microsoft Visual C/C++
- gcc/g++
- clang
この辺が無料で有名。
マイナーなツールチェインを使うと、他のツールから用いる際に、設定をそいつにあわせて書き換える必要が生じかねない。初心者ならとにかく情報の多いデファクトスタンダードを使いたい。情報さえあれば、鮮度や信憑性は見極めなければならないとはいえ、どこをいじればいいかは見つかる。
Microsoft C/C++ Compiler
統合開発環境であるVisual Studioの中に入ってる。開発にVisual Studioを使うのなら、素直にこれを選択するのが楽。
使わない場合(宗教上の理由とか、動作が重たいとか、ライセンスの都合上使えないとか)、「Build Tools for Visual Studio 2017」でツールチェインのみが提供されている。
gcc
Linuxでは最初から入っている、オープンソースのツールチェイン。
Windowsでは、MingwなどGNU環境を導入するツールを通してインストールする。
LLVM Clang
新進気鋭のツールチェイン。様々な言語ソースを統一的に扱うことを目標とするらしい。オープンソース。
Windowsでは、MingwなどGNU環境を導入するツールを通してインストールする。
ビルドツールの選択
ツールチェインは基本的にコマンドラインから引数を与えて使用するが、進化に伴ってちょっとしたプロジェクトでも必要な引数は膨大となり、いちいち把握するのが難しい規模になっている。それを、別途設定ファイルを書くことで、自動的に適切な引数で起動するのが、ビルドツールとなる。
「CMake」が、WindowsでもLinuxでも同じ設定ファイルで動き、設定ファイルの記述もそれなりに簡素で、最近はよく使われているようだ。
また、VisualStudioや、JetBrainsのC++用IDEのCLionでも、基本的にWindowsではCMakeがスタンダードとなっているように見える。
さらに言うと、CMakeはさらに昔より使われていたビルドシステムである「Makefile」の設定ファイルを出力して、実際のビルド処理はMakefileに任せるような仕組みであり、二重行政っぽさある。
このMakefileに取って代わる「Ninja」というビルドシステムが存在し、そちらの方が速いらしく、Visual Studio CodeのCMake用拡張「CMake Tools」の初期設定でもNinjaを優先して使うようになっている。
- User Settings
// The preferred CMake generator(s) to use when configuring (tried in order of listing) "cmake.preferredGenerators": [ "Ninja", "Unix Makefiles" ],
特にMakefileを使う理由も見つからなかったので、初期設定に従うなら、Ninjaも一緒にインストールする。
互換レイヤーの選択
gccやclangを使う場合、Windows上に直接インストールすると言うよりは、Linuxのコマンドを再現する環境(GNU環境、互換レイヤー)を作り、それを通してインストールする。互換レイヤーの実現手段として、主に、CygwinとMSYS2の2つがある。
仮想マシンとはまた違い、あくまで各コマンドに対応したWindows用の.exeを実行する感じ。
両者の違いは、
らしいが、踏み込まなければできることは大体一緒なので、なんとなく棲み分けできそうなMSYS2を選択。
ちなみに、同時にインストールするといろいろ競合が発生して大変なのでどちらか一つだけにし、残りはアンインストールするか、少なくとも環境変数のパスからは外す。
インストールと直後の作業
MSYS2のインストールはインストーラから行う。完了したらスタートメニューの「すべてのプログラム」に「MSYS2 64bit」というのができるので、その中の「MSYS2 MSYS」から、ターミナルを起動する。特に環境変数のパス設定をしない場合、Linuxコマンドはこのターミナル上で有効になる。
スタートメニュー上には同時に「MSYS2 MinGW 32-bit」「MSYS2 MinGW 64-bit」なんてのも用意されている。MinGWは、Windows上にGNU環境(Linuxで使える一般的なコマンド類)を提供するものであり、今回の主目的であるClangやCMakeはMinGWが提供している実行ファイルということになる。ではMSYS2は何をしているのかというと、MinGWの32-bitと64-bitだったり、他の(前述のCygwinなど)GNU環境と実行ファイルがごっちゃにならないように、パス設定をターミナル上でのみ有効にすることで上手く棲み分けられるようにするツールということになる。(とりあえず大雑把にはそういう認識)
閑話休題、MSYSのコンソール上から必要なツールをインストールする。パッケージ管理ツールは「pacman」。ドットを食べそうな名前だ。
上記のサイトによると、MSYSのバージョンにも依るだろうが、まずコアな部分のみ更新してコンソールを再起動した方が無難らしい。
$ pacman -Sy (パッケージデータベースの更新) (再起動) $ pacman --needed -S bash pacman pacman-mirrors msys2-runtime (なにか更新されたら再起動) $ pacman -Suu (アップグレード。互換性次第ではダウングレードも許可する) $ pacman -Ss clang (clang パッケージの検索) mingw32/mingw-w64-i686-clang 5.0.1-3 C language family frontend for LLVM (mingw-w64) ... mingw64/mingw-w64-x86_64-clang 5.0.1-3 C language family frontend for LLVM (mingw-w64) ... msys/mingw-w64-cross-crt-clang-git 5.0.0.4631.3deeda3-1 MinGW-w64 CRT for cross-compiler (検索結果から、mingw64 かつ x86_64 のclangを探しインストール) $ pacman -S mingw-w64-x86_64-clang (同様に、cmake, ninjaなどもインストール)
IDE・エディタの選択
VisualStudioCode
コードエディタ。無料で、特に制約もきつくなく使える中では、それなり軽快で、それなり多機能で、バランスがよいようだ。
がっつりやるならVisualStudioなんだけど、本家は有償だし、無償のExpressはMicrosoftが開発継続に消極的だし拡張機能が制限される、Communityはライセンス上、商用では年商1億未満限定など制約がきつい。
有償ならJetBrainsのCLionが良いと思う。
以下では、記事のタイトルにもあるとおり、VisualStudioCodeでの設定方法を記述する。
インストール後の設定
拡張機能
左パネルの四畳半っぽいアイコンから、拡張機能をインストール。
- C/C++
- CMake
- CMake Tools
- CMake Tools Helper
必要じゃないのもあるかも。
- C/C++ Clang Command Adapter
- C++ Intellisense
これらは一見関係ありそうに見えたが、(設定が悪かったのかも知れないが)1文字入力ごとに解析が走り、VSCodeがフリーズするほど重たくなったので除外。
User Settings
[ファイル]→[基本設定]→[設定]
2つのペインが開き、左がデフォルト値、右がユーザによる上書き設定。右に記述する。
{ "cmake.mingwSearchDirs": [ "C:\\msys64\\ming64" ], }
プロジェクトの作成
BOOSTライブラリの導入
Boost は、C++で“あったら便利”な機能を多方面にわたり実装したライブラリ。ここから正式な機能としてC++に取り入れられることもある。
インストール
MSYS上でインストールできる。
$ pacman -S mingw-w64-x86_64-boost
パスの追加
プロジェクトにboostのパスを追加する。boostを使ったコードの補完が効くようになる。
- .vscode/c_cpp_properties.json
{ "configurations": [ { "name": "Win32", ... "includePath": [ "${workspaceFolder}", "C:\\msys64\\mingw64\\include" ←追加 ], } ], "intelliSenseMode": "clang-x64", }
CMakeLists.txt
CMakeの設定ファイルを編集する。
Boostを使う場合、その旨を引数としてツールチェインに伝える必要があるが、直接指定するよりCMakeに探させる方が記述の変更が少なく理にかなっている。
- CMakeLists.txt
# Boostの場所の検索 # 例えば「boost::program_options」を使っていた場合 FIND_PACKAGE(Boost COMPONENTS program_options REQUIRED) set(SOURCE_FILES src/main.cpp) add_executable(project_name ${SOURCE_FILES}) # add_executable の後に指定する INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS}) TARGET_LINK_LIBRARIES(project_name ${Boost_LIBRARIES})