7. DLL(動的モジュール)の利用

DLL を利用することで、プログラムによるメモリの消費を抑えることができるほか、起動時には静的モジュールのみがロードされますので、起動までの時間(3DS ロゴの表示時間)を短縮することができます。

7.1. 実装

DLL を利用しない場合は 1 つのメインプログラムにすべてを実装しますが、利用した場合はプログラムの実装を複数の動的モジュールに分割し、必要なときに必要なモジュールをメモリにロードして実行することができます。ただし、小さな単位の動的モジュールに分割しすぎると、モジュールのロードに時間がかかったり、頻繁な入れ替えでメモリの管理が複雑になったりする可能性があります。

詳しくは、CTR-SDK の「DLL マニュアル」、「3DS プログラミングマニュアル - システム編」を参照してください。

7.2. ビルド前の準備

4. ビルド前の準備」で行う手順と同じです。

7.3. ビルド

7.3.1. CTR-SDK のビルドシステムでビルドする場合

モジュールのソースの配置や OMakefile の記述方法に注意するだけで、容易に動的モジュールに対応したアプリケーションをビルドすることができます。ただし、アプリケーション(静的モジュール)と動的モジュールの親ディレクトリが同じになるように、モジュールごとにビルドディレクトリを作成し、ソースファイルと OMakefile を個別に配置する必要があることに注意してください。

動的モジュールのビルドのために、OMakefile には以下の設定が追加されています。

表 7-1. 動的モジュールのビルドで追加された設定
設定 内容
TARGET_MODULE 動的モジュールの名前を指定します。
MODULE_LIST 自分以外のモジュール(静的モジュール含む)をすべて指定します。
MODULE_EXPORT_TYPE

動的モジュールの公開種別を指定します。

  • SYMBOL:名前(デフォルト)
  • INDEX:インデックス
  • OFFSET:オフセット
MODULE_ENABLE_OFFSET デフォルトでは true に設定されていますので、すべてのモジュールを同時にビルドする必要があります。false に設定した場合はモジュールのビルドタイミングが自由になりますが、公開種別にオフセットを指定することができなくなります。
MODULE_ADD_DEBUG_INFO 作成される CRR ファイルに CRO ファイルのデバッグ情報を含めるかどうかを指定します。デフォルトは true に設定されていますので、デバッガでのソースデバッグが可能になります。false に設定した場合はソースデバッグができなくなりますが、CRR ファイルのサイズが小さくなります。

動的モジュールのビルドに、RSF ファイル、ICN ファイル、BNR ファイル、DESC ファイルの指定は不要です。また、TARGET_PROGRAM ではなく、TARGET_MODULE に動的モジュールの名前を指定することに注意してください。ビルドの結果、CRO ファイルが作成されます。

コード 7-1. 動的モジュールの OMakefile の例
TARGET_MODULE = Module1
MODULE_LIST = ../App ../Module2
SOURCES = module.cpp

include $(ROOT_OMAKE)/modulerules
build: $(DEFAULT_TARGETS)

静的モジュールのビルドは、通常のビルド設定に MODULE_LIST の指定を追加するだけです。ビルドの結果、CRS ファイルと CRR ファイルが作成されます。

コード 7-2. アプリケーションの OMakefile に追加する設定の例
MODULE_LIST = ../Module1 ../Module2

作成された CRO ファイル、CRS ファイル、CRR ファイルは ROM アーカイブに格納する必要があります。CRO ファイルと CRS ファイルには、配置や圧縮に制限がありません。CRR ファイルには、ルート直下に作成した「.crr」ディレクトリに無圧縮で配置し、そのディレクトリには CRR ファイル以外を格納しないという強い制限があります。

以下の例は、動的モジュールを利用したアプリケーションのビルドで、各ファイルの格納を OMake で自動化する方法です。

コード 7-3. 動的モジュールのファイルの格納を自動化する OMakefile の例
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 編)」を参照してください。