DLL を利用することで、プログラムによるメモリの消費を抑えることができるほか、起動時には静的モジュールのみがロードされますので、起動までの時間(3DS ロゴの表示時間)を短縮することができます。
7.1. 実装
DLL を利用しない場合は 1 つのメインプログラムにすべてを実装しますが、利用した場合はプログラムの実装を複数の動的モジュールに分割し、必要なときに必要なモジュールをメモリにロードして実行することができます。ただし、小さな単位の動的モジュールに分割しすぎると、モジュールのロードに時間がかかったり、頻繁な入れ替えでメモリの管理が複雑になったりする可能性があります。
詳しくは、CTR-SDK の「DLL マニュアル」、「3DS プログラミングマニュアル - システム編」を参照してください。
7.2. ビルド前の準備
「4. ビルド前の準備」で行う手順と同じです。
7.3. ビルド
7.3.1. CTR-SDK のビルドシステムでビルドする場合
モジュールのソースの配置や OMakefile の記述方法に注意するだけで、容易に動的モジュールに対応したアプリケーションをビルドすることができます。ただし、アプリケーション(静的モジュール)と動的モジュールの親ディレクトリが同じになるように、モジュールごとにビルドディレクトリを作成し、ソースファイルと OMakefile を個別に配置する必要があることに注意してください。
動的モジュールのビルドのために、OMakefile には以下の設定が追加されています。
設定 | 内容 |
---|---|
TARGET_MODULE | 動的モジュールの名前を指定します。 |
MODULE_LIST | 自分以外のモジュール(静的モジュール含む)をすべて指定します。 |
MODULE_EXPORT_TYPE |
動的モジュールの公開種別を指定します。
|
MODULE_ENABLE_OFFSET | デフォルトでは true に設定されていますので、すべてのモジュールを同時にビルドする必要があります。false に設定した場合はモジュールのビルドタイミングが自由になりますが、公開種別にオフセットを指定することができなくなります。 |
MODULE_ADD_DEBUG_INFO | 作成される CRR ファイルに CRO ファイルのデバッグ情報を含めるかどうかを指定します。デフォルトは true に設定されていますので、デバッガでのソースデバッグが可能になります。false に設定した場合はソースデバッグができなくなりますが、CRR ファイルのサイズが小さくなります。 |
動的モジュールのビルドに、RSF ファイル、ICN ファイル、BNR ファイル、DESC ファイルの指定は不要です。また、TARGET_PROGRAM ではなく、TARGET_MODULE に動的モジュールの名前を指定することに注意してください。ビルドの結果、CRO ファイルが作成されます。
TARGET_MODULE = Module1 MODULE_LIST = ../App ../Module2 SOURCES = module.cpp include $(ROOT_OMAKE)/modulerules build: $(DEFAULT_TARGETS)
静的モジュールのビルドは、通常のビルド設定に MODULE_LIST の指定を追加するだけです。ビルドの結果、CRS ファイルと CRR ファイルが作成されます。
MODULE_LIST = ../Module1 ../Module2
作成された CRO ファイル、CRS ファイル、CRR ファイルは ROM アーカイブに格納する必要があります。CRO ファイルと CRS ファイルには、配置や圧縮に制限がありません。CRR ファイルには、ルート直下に作成した「.crr」ディレクトリに無圧縮で配置し、そのディレクトリには CRR ファイル以外を格納しないという強い制限があります。
以下の例は、動的モジュールを利用したアプリケーションのビルドで、各ファイルの格納を OMake で自動化する方法です。
MODULE_NAMES = Module1 Module2 MODULES_ROOT = ../ MODULE_CRO = $(addprefix $(ROMFS_ROOT)/, $(addsuffix .cro, $(MODULE_NAMES))) STATIC_CRS = $(ROMFS_ROOT)/static.crs STATIC_CRR = $(ROMFS_ROOT)/.crr/static.crr ROMFS_DEPENDENCIES = $(MODULE_CRO) $`(STATIC_CRS) $`(STATIC_CRR) foreach(TARGET, $(BUILDER.getTargets $(SUPPORTED_TARGETS))) foreach(module, $(MODULE_NAMES)) src = $(file $(TARGET.getImageDirectoryOf $(MODULES_ROOT)$(module))/$(module).cro) dst = $(addprefix $(ROMFS_ROOT)/, $(addsuffix .cro, $(module))) $(dst) : $(src) cp $< $@ $(STATIC_CRS): $(TARGET.getImageDirectory false)/$(TARGET_PROGRAM).crs cp $< $@ $(STATIC_CRR): $(TARGET.getImageDirectory false)/$(TARGET_PROGRAM).crr mkdir -p $(dirname $@) cp $< $@
詳細については CTR-SDK の「ビルドシステムマニュアル(DLL 編)」を参照してください。
7.3.2. CTR-SDK のビルドシステム以外でビルドする場合
CTR-SDK のビルドシステムを使用せずに動的モジュールをビルドするには、部分リンクやシンボルの参照解決など、特別な手順をビルドシステムに追加する必要があります。
詳細については CTR-SDK の「ビルドシステム構築ガイド(DLL 編)」を参照してください。
7.4. デバッグ
CRR ファイルに CRO ファイルのデバッグ情報が含まれるように設定してビルドした場合は、デバッガによるソースデバッグが可能になります。
CRR ファイルに CRO ファイルのデバッグ情報を含める方法については、「7.3.1. CTR-SDK のビルドシステムでビルドする場合」、CTR-SDK の「ビルドシステム構築ガイド(DLL 編)」を参照してください。