Visual Studio

CMakeでrc.exeが見つからずにエラーになる場合の対処方法

Visual Studio 2019をインストールしている環境で、CMakeのコンパイラにVisual Studio 2015を指定した場合など、Configure時点でrc.exeなどが見つからずにエラーになる場合があるため、その対処方法をのせておきます。

CMakeのエラー事象

Visual Studio 2019をインストールしている環境で、VS2015のビルド環境からCMakeを起動するとConfigure時にCMakeTestCXXCompiler.cmakeCMake Errorが発生します。
詳細なメッセージを確認すると、rcコマンド部分で 指定されたファイルが見つかりませんというエラーが発生しているようです。

CMakeでエラーになる原因

ビルド時に使うrc.exeなどはWindows 10 SDKに含まれているようなのですが、Windows 10 SDKは複数バージョンを同時にインストールできるようになっているため、SDKのバージョンごとにフォルダが作成されます。そして、rc.exeなども、各Windows 10 SDKのフォルダ配下に格納されます

Visual Studio 2019の環境ではデフォルトで使用するWindows 10 SDKのフォルダにパスが通っていますが、Visual Studio 2015のビルド環境ではWindows 10 SDKのフォルダにパスが通っていません。そのため、CMakeのConfigure時にrc.exeなどが見つからずにエラーが発生します。

Visual StudioのNative Tools Command Promptを起動して、whereコマンドでrcを検索したときの結果は以下の通りです。VS2019の場合はWindows 10 SDKへのパスが通った状態ですが、VS2015の場合はパスが通っていないためファイルが見つかりません。

**********************************************************************
** Visual Studio 2019 Developer Command Prompt v16.5.2
** Copyright (c) 2019 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x64'

C:\Program Files (x86)\Microsoft Visual Studio\2019\Community>where rc
C:\Program Files (x86)\Windows Kits\10\bin\10.0.18362.0\x64\rc.exe
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC>where rc
情報: 与えられたパターンのファイルが見つかりませんでした。

対処方法

利用しているWindows 10 SDKの該当フォルダにパスを通せばOKです。

Windows 10 SDKはC:\Program Files (x86)\Windows Kits\10\binにバージョンごとのフォルダが作成されるため、利用するバージョン配下のx64フォルダにパスを通します。
このとき既定のWindows 10 SDKのバージョンは、環境変数WindowsSDKVersionに格納されていると思われるため、C:\Program Files (x86)\Windows Kits\10\bin\%WindowsSDKVersion%x64というパスの指定も可能です。

Windows 10 SDKへのパスが設定されないのはVS2015の環境だけだと思われる(VS2019ではパスが通っている)ため、VS2015 x64 Native Tools コマンドプロンプトを起動したときだけ、以下のコマンドを入力してWindows 10 SDKへのパスを追加すると良いと思います。

# VS2015 x64 Native Tools Command PromptでWindows 10 SDKへのパスを追加する
set PATH=%PATH%;C:\Program Files (x86)\Windows Kits\10\bin\%WindowsSDKVersion%x64

対応方法を調べている途中で、rc.exercdll.dllをVCのディレクトリにコピーするような情報も見つけましたが、実際のビルドではrc.exe以外のファイルも必要になるケースが多いため、ファイルをコピーするのではなく、上記で紹介しているパスを通す方法をおすすめします。