Happy My Life

日常とか技術とか

Clang 3.4をVisualStudioから利用する

先日、Clang 3.4がリリースされました。

このClang 3.4には様々な新機能が追加されましたが、その一つにVisual StudioC/C++コンパイラドライバ(cl.exe)を、clangに置き換えるコンパイラドライバ(clang-cl.exe)が正式リリースされたことが挙げらます。そのリリース文は次の通りです。

clang-cl provides a new driver mode that is designed for compatibility with Visual Studio’s compiler, cl.exe.

このclang-cl.exeは、オプションがcl.exe互換となっているコンパイラドライバです。つまり、ビルド時にcl.exeをclang-cl.exeに置き換えることで、Visual C++のコードをclangを利用してビルドできるようになります。

しかも、clang for windowsでは、cl.exeとclang-cl.exeの切り替えがプロジェクトのプロパティで切り替えできるよう、Visual Studio向けの設定ファイルも同梱されてます。これは、Windowsアプリ開発者の方は一度試してみる価値があるのでは?

ということで、その手順は以下の通り。

あらかじめVisual Studio 2010以降がインストールされているものとします(Express版もOK)。私はVisual Studio 2013 Express for Windows DesktopWindows7 Ultimate(64bit)で検証しました。

インストール方法

まず、LLVMのダウンロードページからClang for Windowsをダウンロードします。

llvm-win-vs2013-1

次にダウンロードしたClang for Windowsをインストールします。先ほどダウンロードしたClang for Windowsをダブルクリックします。すると、おなじみのインストーラーが起動します。いろいろ尋ねられますが、すべてデフォルト設定でインストールしました。

次にClang for WindowsVisual Studioから呼びだすための設定ファイルをインストールします。

まず、コマンドプロンプトを管理者モードで起動します。install.batファイルを実行します。

cd C:\Program Files (x86)\LLVM\tools\msbuild
> install.bat

すると、インストールされているVisual Studioのバージョンに合わせて設定ファイルがインストールされます(詳しくはinstall.batファイルを参考に)

これで設定終了です。

プロジェクトの設定を変更する

あとは、プロジェクトのプロパティで、コンパイラをclang-cl.exeへ切り替えます。

Visual C++のプロジェクトのプロパティを開いたあと、「構成プロパティ」-> 「全般」 -> 「プラットフォーム ツールセット」を選択します。ここで"LLVM-○○"を選択します。これで設定終了です(おそらく既存プロジェクトも同様に変更可能のはず)

llvm-win-vs2013-2

ビルドすると、次のようなログが出力されます。このログでは、clang-cl.exeを利用してビルドされていることが分かります。

1>------ ビルド開始: プロジェクト:ConsoleApplication2, 構成:Debug Win32 ------
1>clang-cl.exe : warning : argument unused during compilation: '/ZI'
1>clang-cl.exe : warning : argument unused during compilation: '/Gm'
(中略)
1>clang-cl.exe : warning : argument unused during compilation: '/FdDebugvc120.pdb'
1>clang-cl.exe : warning : argument unused during compilation: '/Gd'
1>  ConsoleApplication2.vcxproj -> c:usersnrkzdocumentsvisual studio 2013ProjectsConsoleApplication2DebugConsoleApplication2.exe
========== ビルド: 1 正常終了、0 失敗、0 更新不要、0 スキップ ==========