私のC ++コードのディレクトリ構造は次のようになります。
|
|->include
|->src
私のコードのCMakeLists.txtファイルを書いています。違いを理解したいinclude_directories
とtarget_include_directories
中をCMake
。
それらの使用法と、使用するインクルードファイルパスを追加するための違いは何ですか?
私のC ++コードのディレクトリ構造は次のようになります。
|
|->include
|->src
私のコードのCMakeLists.txtファイルを書いています。違いを理解したいinclude_directories
とtarget_include_directories
中をCMake
。
それらの使用法と、使用するインクルードファイルパスを追加するための違いは何ですか?
回答:
include_directories(x/y)
ディレクトリのスコープに影響します。このCMakeList内のすべてのターゲット、およびその呼び出しの後に追加されたすべてのサブディレクトリ内のターゲットは、パスを持ちますx/y
それらのインクルードパスに追加されます。
target_include_directories(t x/y)
ターゲットスコープがある-ターゲットx/y
のインクルードパスに追加されますt
。。
すべてのターゲットが対象のインクルードディレクトリを使用している場合は、前者が必要です。パスがターゲットに固有である場合、またはパスの可視性をより細かく制御する場合は、後者を使用します。後者は事実から来ているtarget_include_directories()
サポートPRIVATE
、PUBLIC
およびINTERFACE
修飾子を。
x/y
使用するすべての依存ターゲットのパスが含ま中をt
自分の中でtarget_link_libraries
コマンドを。もちろん前者のための場所がありますが、私は後者が一般的にはより良いと思います。
include_directories
に追加されるターゲットとサブディレクトリのみが影響を受けると述べていました。私は答えを編集しています:ドキュメントには、現在のCMakeListsのすべてのターゲットが影響を受けることが明記されています。ドキュメントには言及されていませんが、影響を受けた後のサブディレクトリのみが影響を受けます(元の回答で正しく述べられていたとおり)
target_include_directories
はCMake 2.8.11(2013年5月)で導入されました
何の横にAngewの答えは正しく、間に別の非常に重要な違いを言うinclude_directories
とtarget_include_directories
一緒に使用する場合、つまりPUBLIC
またはINTERFACE
後者の移入、INTERFACE_INCLUDE_DIRECTORIES
ターゲットのプロパティを。このプロパティは、別のターゲットtarget_link_libraries
が元のターゲットへのリンクに使用する場合に役立ちます。リンクターゲットには、それらのインクルードディレクトリが自動的に追加されるためです。例を見る。
この重要な機能はドキュメントではかなりよく隠されています:target_include_directoriesはpopulatingについて言及してINTERFACE_INCLUDE_DIRECTORIES
おり、そのドキュメントには次のように書かれています:
target_link_libraries()を使用してターゲットの依存関係を指定すると、CMakeはすべてのターゲットの依存関係からこのプロパティを読み取り、コンシューマーのビルドプロパティを決定します。
PUBLIC
物件等のわかりやすい解説は初めてです!ありがとう:D
include_directories
とのドキュメントを読みましたtarget_include_directories
か?それらの違いについてあなたが理解していないのは何ですか?