web-dev-qa-db-ja.com

CMakeのinclude_directoriesとtarget_include_directoriesの違いは何ですか?

次のようなC++コードのディレクトリ構造があります。

|
|->include
|->src

コード用にCMakeLists.txtファイルを作成しています。 CMakeinclude_directoriestarget_include_directoriesの違いを理解したいと思います。

それらの使用法と、インクルードファイルパスを追加するために、どちらを使用すべきかとの違いは何ですか?

95
Ujjwal Aryan

include_directories(x/y)はディレクトリスコープに影響します。このCMakeList内のすべてのターゲット、およびその呼び出しポイントの後に追加されたすべてのサブディレクトリ内のターゲットには、パスx/yがインクルードパスに追加されます。

target_include_directories(t x/y)にはターゲットスコープがあります。ターゲットtのインクルードパスにx/yを追加します。

すべてのターゲットが対象のインクルードディレクトリを使用する場合は、前者が必要です。パスがターゲットに固有の場合、またはパスの可視性をより細かく制御する場合は、後者が必要です。後者は、target_include_directories()PRIVATEPUBLIC、およびINTERFACE修飾子をサポートするという事実に由来します。

107
Angew

Angewの答え が正しく言うことのほかに、include_directoriestarget_include_directoriesのもう1つの非常に重要な違いは、PUBLICまたはINTERFACE、後者はターゲットのINTERFACE_INCLUDE_DIRECTORIESプロパティを設定します。このプロパティは、別のターゲットがtarget_link_librariesを使用して元のターゲットにリンクする場合に役立ちます。リンクターゲットには、これらのインクルードディレクトリが自動的に追加されるためです。 example を参照してください。

この重要な機能はドキュメンテーションにかなり隠されています: target_include_directoriesINTERFACE_INCLUDE_DIRECTORIESの生成に言及し、その documentation 言う:

target_link_libraries() を使用してターゲットの依存関係が指定されると、CMakeはすべてのターゲットの依存関係からこのプロパティを読み取り、コンシューマのビルドプロパティを決定します。

32
Antonio

@Angewが言ったように、まさに違いは:

1、include_directories()はソースツリー内のすべてのファイルにアクセスできます。target_include_directories()はコンパイル時に特定のターゲットに対してのみアクセス可能です。

1
Nick.Rhan