IDLファイルで#include文を使用して他のIDLファイルをインクルードし、IDLコンパイラ(IDLc)でコンパイルすると、生成されたソースにインクルードしたIDLファイルの定義を含むことができます。しかし、複数のIDLファイルから同一のIDLファイルをインクルードしていると、同一の定義がそれぞれのスタブ・スケルトンに生成されるため、リンケージ時にリンクエラーが発生します。
#include文を含むIDLファイルのコンパイルについて、下図に示します。
複数のIDLファイルから同一のIDLファイルをインクルードしている際に発生するリンクエラーを防止する対策として、IDLコンパイラ(IDLc)の-noincludeオプションを用います。これにより#include文で定義されたIDLファイル(以降、インクルードファイルという)を展開しないため、スタブ・スケルトンの生成時には、ヘッダ定義として“#include XX.h”(IDLファイル名をXX.idlとする)だけが記述されます。なお、インタフェースリポジトリには、IDLコンパイラ実行時に指定されたIDLファイルの情報だけが登録され、インクルードファイルの情報は登録されません。
-noincludeオプションを指定しない場合と指定した場合のマッピング結果を下図に示します。
-noinclude機能を使用するケース
-noincludeオプションを指定することで、以下の多重定義を避けることができます。
(1) マッピングする場合
インクルードファイルがすでにIDLコンパイル済みであり、IDLファイルの生成物とリンクする場合。
複数のIDLファイルで同一のインクルードファイルを定義しており、生成物同士をリンクする場合。
(2) インタフェースリポジトリに登録する場合
すでにインクルードファイルの情報がインタフェースリポジトリに登録されており、IDLファイルの情報だけをインタフェースリポジトリに登録する場合。
複数のIDLファイルで同一のインクルードファイルを定義しており、すべてのIDL定義をインタフェースリポジトリに登録する場合。