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オプションを指定することにより、以下の多重定義を避けることができます。
インクルードファイルがすでにIDLコンパイル済みであり、IDLファイルの生成物とリンクする場合。
複数のIDLファイルで同一のインクルードファイルを定義しており、生成物同士をリンクする場合。
すでにインタフェースリポジトリにインクルードファイルの情報が登録されている状態で、IDLファイルの情報だけをインタフェースリポジトリに登録する場合。
複数のIDLファイルで同一のインクルードファイルを定義している状態で、すべてのIDL定義をインタフェースリポジトリに登録する場合。