概要
Header Search Paths(ヘッダ検索パス)周りの設定について調べてみました。
- ヘッダのインクルード形式の違い
- Header Search Paths
- User Header Search Paths
- non-recursiveとrecursive
- パスの指定方法
- Always Search User Paths(Deprecated)
- Use Header Maps
- System Header Search Paths
- 実験
- プロジェクトファイルからヘッダファイルへの参照がある場合
- プロジェクトファイルからヘッダファイルへの参照がない場合
- .mファイルと同じディレクトリに.hファイルが存在する場合
- .mファイルと同じディレクトリに.hファイルが存在しない場合
ヘッダのインクルード形式の違い
ヘッダ形式
-
#include <header.h>
(システムヘッダやフレームワークのヘッダを指定する場合) -
#include "header.h"
(開発者が作成したヘッダを指定する場合)
Header Search Paths
環境変数名: HEADER_SEARCH_PATHS
#include <header.h>
形式で指定されているヘッダファイルを検索するために検索対象となるパスのリストです。
non-recursiveとrecursive
Search Pathsの設定では、パスごとにnon-recursiveかrecursiveを設定できます。recursiveが設定されている場合、指定したパスのサブディレクトリも検索対象となります。
パスの指定方法
パスはスペースで区切って列挙するため、パスにスペースが含まれる場合はクオーテーション(""
)で囲む必要があります。
User Header Search Paths
環境変数名: USER_HEADER_SEARCH_PATHS
#include "header.h"
形式で指定されているヘッダファイルを検索するために検索対象となるパスのリストです。User Header Search Pathsをコンパイラサポートしていない場合、Header Search Pathsの先頭に追加されます。後述するAlways Search User Pathsの設定によってHeader Search PathsとUser Header Search Pathsを使い分けます。Always Search User Pathsが有効になっている場合は#include <header.h>
形式のヘッダファイルも対象となります。
CocoaPodsをプロジェクトで導入している場合、User Header Search Pathsに自動で以下のようにパスが設定されます。
Always Search User Paths(Deprecated)
環境変数名: ALWAYS_SEARCH_USER_PATHS
Xcode 8.3以降で非推奨となり、New Build Systemではサポートされません。プロジェクトでこの設定を有効にしている場合は以下の警告がでます。
warning: Traditional headermap style is no longer supported; please migrate to using separate headermaps and set 'ALWAYS_SEARCH_USER_PATHS' to NO.
Xcode10ではデフォルトでNoが設定されています。この設定が有効になっている場合、Header Search PathsよりもUser Header Search Pathsを優先してヘッダファイルを検索します。User Header Search Pathsはビルドコマンドでは-iquote
フラグで指定され、#include
文でヘッダが指定されている場合にのみUser Header Search Pathsを検索します。
Use Header Maps
環境変数名: USE_HEADERMAP
Header Mapを有効にする設定です(デフォルトでYes)。この設定が有効になっている場合、Header Search Pathsの設定を考慮せず、ヘッダファイル名からマッピングを行います。これにより、Header Search Pathsの設定を行わずにヘッダをインクルードできます。
System Header Search Paths
環境変数名: SYSTEM_HEADER_SEARCH_PATHS
システムヘッダファイルを検索するために検索対象となるパスのリストです。優先度が高い順に列挙します。Header Search Pathsに似ていますが、こちらに記述した場合、システムヘッダで見つかるほとんどの警告が表示されないようになります。System Header Search Pathsをコンパイラがサポートしていない場合、Header Search Pathsの先頭に追加されます。
実験
プロジェクトファイルからヘッダファイルへの参照がある場合
ヘッダファイルに対し、プロジェクトファイルからの参照がある場合
(Xcode上でファイル名が赤くなっていない場合)
結果
Search Pathsの設定に関わらず、へッダが正しく検索される
プロジェクトファイルからヘッダファイルへの参照がない場合
ヘッダファイルに対し、プロジェクトファイルからの参照がない場合
(Xcode上でファイル名が赤くなっている場合)
結果
.mファイルと同じディレクトリに.hファイルが存在する場合
Search Pathsの設定に関わらず、へッダが正しく検索される
.mファイルと同じディレクトリに.hファイルが存在しない場合
Search Pathsの設定にパスを正しく設定しないと、へッダが正しく検索されない