Clang++ 3.9.1 を Windows 10 で動かす

巷の情報をもとに Windows 10 に Clang++ 3.9.1 をインストールしたら iostream がないと怒られ,インクルードパスを mingw に通したら char16_t がないと怒られたけど,実は mingw は要らなくて,代わりに Visual Studio 2015 に C++ Tools (と,多分 Universal Windows Platform Tools も)を追加して Clang++ にパスをゴリゴリ教えたら一応動いたよ,という話.


うまくいかなかった不要な手順も書くので注意されたい.

LLVM Download Page で LLVM 3.9.1 の Pre-Built Binaries の Clang for Windows (64-bit) を落としてきてインストールした.

cppファイルをコンパイルすると

fatal error: 'iostream' file not found
#include<iostream>
        ^

などと怒られた.

clangは標準ライブラリを内蔵しておらず, LLVM Clang の Windows へのインストールと使い方 | プログラマーズ雑記帳 によれば

インストール先のフォルダーはデフォルト(C:\MinGW)から変更してはダメです。 変更するとclang はヘッダー等を見つけられなくなります。

とのことだが,私はmingwを Chocolatey でインストールしたので C:\tools\mingw64 にあった.

g++で -v オプションをつけてコンパイルするとメッセージ中に

#include <...> search starts here:
 C:/tools/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.3.0/include
 C:/tools/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.3.0/include-fixed
 C:/tools/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.3.0/../../../../x86_64-w64-mingw32/include
 C:/tools/mingw64/lib/gcc/../../x86_64-w64-mingw32/include/c++
 C:/tools/mingw64/lib/gcc/../../x86_64-w64-mingw32/include/c++/x86_64-w64-mingw32
 C:/tools/mingw64/lib/gcc/../../x86_64-w64-mingw32/include/c++/backward
End of search list.

とあるので,これをclang++にも読ませればええんやろということで,clang++に -I "C:/tools/mingw64/lib/gcc/x86_64-w64-mingw32/5.3.0/include" -I "C:/tools/mingw64/lib/gcc/x86_64-w64-mingw32/5.3.0/inc
lude-fixed" -I "C:/tools/mingw64/x86_64-w64-mingw32/include" -I "C:/tools/mingw64/x86_64-w64-mingw32/include/c++" -I "C:
/tools/mingw64/x86_64-w64-mingw32/include/c++/x86_64-w64-mingw32" -I "C:/tools/mingw64/x86_64-w64-mingw32/include/c++/ba
ckward" をつけてコンパイルしたのだが,今度は

C:/tools/mingw64/x86_64-w64-mingw32/include/c++\bits/stringfwd.h:63:33: error: use of undeclared identifier 'char16_t'
 template<> struct char_traits<char16_t>;

などと怒られた. char16_t を知らないらしい.

というかそもそも,clang++に -v オプションをつけてコンパイルすると

#include <...> search starts here:
 C:\Program Files\LLVM\bin\..\lib\clang\3.9.1\include
 C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include
 C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A
End of search list.

と書いてあって, C:\MinGW も読んでないやんという感じ.代わりにVisual Studio 2015の関連フォルダを読んでいる.

gcc – How to use clang with mingw-w64 headers on windows – Stack Overflow によれば, Clang 3.7.1 以降ではMinGWを使うのをやめてVisual Studio 2015に依存するようになったとのこと.

私は Unity を入れているためにVisual Studio 2015が既に入っていたので, Visual Studio 2015 の Visual C++ に従って,VSを立ち上げて File > New > Project... > Installed > Templates > Other Languages > Visual C++ > Install Visual C++ 2015 Tools for Windows Desktop でC++関連ファイルを追加した.Windowsソフトウェア開発用のツールも強制的についてくるらしくけっこう時間かかるので覚悟されたい.上述のStack OverflowによればVS2015を持ってない人は「Microsoft Visual C++ Build Tools 2015 Update 3」を入れれば軽くて済むらしい(未検証).

で,入れ終わってclang++でコンパイルすると

C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\crtdefs.h:10:10: fatal error: 'corecrt.h' file not found
#include <corecrt.h>
         ^

と怒られた.ググると corecrt.h はWindows SDK関連のものっぽい.

Qtでcorecrt.hが見つからないと言われる問題 – あくまで個人的メモ用ブログ に近い事例が載っていたので,再びVSを立ち上げて File > New > Project... > Installed > Templates > Other Languages > Visual C++ > Windows > Install Universal Windows Platform Tools でWindows 10 SDKを追加した.なんかまたC++ Toolsがついてきてお前さっきも入れたやろってなったのだが外せなかった.さっきよりさらに重いので覚悟されたい.もしかしたらさっきの手順は不要でこっちだけでいいかもしれない?(未検証)

で,入れ終わってコンパイルすると変化なし.そういえばclang++が読みに行くのは C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A だが,追加されたのは C:\Program Files (x86)\Windows Kits\10 だった.8.1Aの正体がいまいちよくわからんし,いい加減体力が尽きてきたので思考停止してパスを無理矢理通すことにした.

corecrt.h を通すために -I "C:\Program Files (x86)\Windows Kits\10\Include\10.0.14393.0\ucrt" を, kernel32.lib もないと言われるので -L "C:\Program Files (x86)\Windows Kits\10\Lib\10.
0.14393.0\um\x64" を, libucrt.lib もないと言われるので -L "C:\Program Files (x86)\Windows Kits\10\Lib\10.0.14393.0\ucrt\x64" をゴリゴリ足してコンパイルしてやると,やっと通った.


とても汚いが,ひとまず動いた.結局,

  1. 公式のClangを入れて
  2. Visual C++ 2015 Toolsを入れて
  3. Windows 10 SDKを入れて
  4. corecrt.hkernel32.liblibucrt.libを探してパスを教えてやる

と動くことがわかった.(最後は代わりに環境変数の CPATH と LIBRARY_PATH を設定しても動くと思うが,mingwと共存させる場合は環境変数を読まれるとまずそう.(未検証))

備考1

せっかくなので,復元ポイントを作成した上で長い時間をかけてWindows 8.1 SDKも入れてみたけど,やっぱり8.1Aの中にはできなかったしKits\8.1にcorecrt.hとかないしでダメっぽい.(復元した)

備考2

なんかせっかくVS関係のファイルをいろいろ入れたので,重い代わりにデバッグツールの優秀なVSをエディタに使うのもいいかもしれない.参考:Clang with Microsoft CodeGenがでたので試す – Qiita

VSからインストールしたClangが使えれば楽だろうと思ったが,コマンドラインから実行するとc2.dllがないと怒られて(c2.dllはサブディレクトリに入っている),パスの与え方がすぐにはわからなかったのでやめた.VSから実行すれば動くのでVSの使っている実行オプションがわかればいいけど.

まぁ,最新版使いたいし……(VSのはちょっとだけ古い)