JUCEで作ったVSTがビルドできないときの直し方

JUCEのProjucerで初めてVSTを作っていたところ、Visual Studioのビルドで大量のエラーが発生した。最終的には、Projucerのモジュール設定を修正してプロジェクトを再生成することで解決できた。

発生した症状

最初に出ていた代表的なエラーは次のとおり。

C2653: 'juce': is not a class or namespace name
LNK1181: cannot open input file 'MyFirstVST.lib'

juce名前空間が見つからないため、AudioProcessorやAudioProcessorEditorなども連鎖的に未定義になっていた。

MyFirstVST.libが見つからないエラーは、ライブラリを作る前段階のShared Codeプロジェクトが失敗していたことによる二次的なエラーだった。

原因

Projucerのプロジェクト設定で、JUCEモジュールが正しく登録されていなかった。

特に、プロジェクトの.jucerファイルにはモジュール設定がほぼなく、生成されたJuceHeader.hもProjectInfoだけを含む状態だった。そのため、ソースコードが次のヘッダーを読み込んでも、JUCE本体のクラスが定義されていなかった。

#include <JuceHeader.h>

修正手順

1. ProjucerでModulesを開く

Projucerで対象プロジェクトを開き、左側のModulesを選択する。

2. JUCEモジュールを追加する

Addから、プロジェクトに必要なモジュールを追加した。今回のプロジェクトでは、最終的に次のモジュールが登録された。

  • juce_audio_basics
  • juce_audio_devices
  • juce_audio_formats
  • juce_audio_plugin_client
  • juce_audio_processors
  • juce_audio_processors_headless
  • juce_audio_utils
  • juce_core
  • juce_data_structures
  • juce_events
  • juce_graphics
  • juce_gui_basics
  • juce_gui_extra

モジュール追加後に表示されるAdd missing dependenciesも実行した。

3. モジュールのパスを確認する

JUCEモジュールのパスは、プロジェクト内のJUCEディレクトリを指定する。

C:\Users\Kurosiko\git\vastts\juce\modules

Projucerの設定では、各モジュールのパスが次のように生成された。

../juce/modules

4. プロジェクトを再生成する

Projucer上部のSave and Open in IDEをクリックする。

これによって、.jucerの設定から次のファイルが更新される。

  • JuceHeader.h
  • AppConfig.h
  • Visual Studioのソリューション・プロジェクトファイル

修正後のJuceHeader.hには、たとえば次のようなモジュールヘッダーが含まれる。

#include <juce_audio_devices/juce_audio_devices.h>
#include <juce_audio_plugin_client/juce_audio_plugin_client.h>
#include <juce_audio_processors/juce_audio_processors.h>
#include <juce_audio_utils/juce_audio_utils.h>

5. Visual Studioで外部変更を読み込む

Visual Studioに次のダイアログが表示されたら、Reload Allを選択する。

File Modification Detected
The project has been modified outside the environment.

Projucerで生成した新しいプロジェクト設定をVisual Studioへ反映するために必要な操作だった。

6. CleanしてからRebuildする

Visual Studioのメニューから次の順に実行する。

Build > Clean Solution
Build > Rebuild Solution

途中で発生した追加エラー

最初のモジュール追加後、次のエラーが残った。

C1189: To compile AudioUnitV3 and/or Standalone plug-ins,
you need to add the juce_audio_utils and juce_audio_devices modules!

juce_audio_devicesは追加済みだったが、juce_audio_utilsが不足していた。juce_audio_utilsをProjucerから追加して再度プロジェクトを生成したところ、このエラーも解消した。

最終結果

Visual Studioの出力は次の状態になった。

Rebuild All: 4 succeeded, 0 failed, 0 skipped
Rebuild completed

生成されたものは次のとおり。

  • VST3プラグイン
  • Standalone Pluginの実行ファイル
  • Shared Codeのライブラリ

なお、JUCE内部ファイルについてコードページに関するC4819警告が出たが、ビルドを失敗させるエラーではなかった。

今回の教訓

  • Clean Solutionは古い生成物を消す操作で、Projucerの設定不足そのものは直さない。
  • juce名前空間が丸ごと見つからない場合は、ソースコードより先にJuceHeader.hとProjucerのModulesを確認する。
  • LNK1181で.libが見つからない場合は、そのライブラリを生成する前のプロジェクトのエラーを確認する。
  • Audio Pluginではjuce_audio_plugin_clientだけでなく、juce_audio_utilsとjuce_audio_devicesも必要になることがある。
  • Projucerで設定を変更した後は、必ずSave and Open in IDE、Reload All、Clean、Rebuildまで行う。