次のようなC++コードのディレクトリ構造があります。
|
|->include
|->src
コード用にCMakeLists.txtファイルを作成しています。 CMake
のinclude_directories
とtarget_include_directories
の違いを理解したいと思います。
それらの使用法と、インクルードファイルパスを追加するために、どちらを使用すべきかとの違いは何ですか?
include_directories(x/y)
はディレクトリスコープに影響します。このCMakeList内のすべてのターゲット、およびその呼び出しポイントの後に追加されたすべてのサブディレクトリ内のターゲットには、パスx/y
がインクルードパスに追加されます。
target_include_directories(t x/y)
にはターゲットスコープがあります。ターゲットt
のインクルードパスにx/y
を追加します。
すべてのターゲットが対象のインクルードディレクトリを使用する場合は、前者が必要です。パスがターゲットに固有の場合、またはパスの可視性をより細かく制御する場合は、後者が必要です。後者は、target_include_directories()
がPRIVATE
、PUBLIC
、およびINTERFACE
修飾子をサポートするという事実に由来します。
Angewの答え が正しく言うことのほかに、include_directories
とtarget_include_directories
のもう1つの非常に重要な違いは、PUBLIC
またはINTERFACE
、後者はターゲットのINTERFACE_INCLUDE_DIRECTORIES
プロパティを設定します。このプロパティは、別のターゲットがtarget_link_libraries
を使用して元のターゲットにリンクする場合に役立ちます。リンクターゲットには、これらのインクルードディレクトリが自動的に追加されるためです。 example を参照してください。
この重要な機能はドキュメンテーションにかなり隠されています: target_include_directoriesINTERFACE_INCLUDE_DIRECTORIES
の生成に言及し、その documentation 言う:
target_link_libraries() を使用してターゲットの依存関係が指定されると、CMakeはすべてのターゲットの依存関係からこのプロパティを読み取り、コンシューマのビルドプロパティを決定します。
@Angewが言ったように、まさに違いは:
1、include_directories()はソースツリー内のすべてのファイルにアクセスできます。target_include_directories()はコンパイル時に特定のターゲットに対してのみアクセス可能です。