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


134

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

|
|->include
|->src

私のコードのCMakeLists.txtファイルを書いています。違いを理解したいinclude_directoriestarget_include_directories中をCMake

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


4
include_directoriesとのドキュメントを読みましたtarget_include_directoriesか?それらの違いについてあなたが理解していないのは何ですか?
一部のプログラマー

74
ドキュメントは明確ではありません。私はそれを読んで、Angewが彼の答えで書いたものを推測しましたが、説明、例はなく、プロジェクトの構築を目的としたシステムの場合、CMakeのドキュメントにプロジェクトベースの例はありません。CMakeの優れた包括的なドキュメントがあった場合、私はこれらの質問でコミュニティに負担をかけなかっただろう。
Ujjwal Aryan 2015

cmakeの概念は十分に文書化されていません。特にターゲットを定め、「ターゲットを絞っていない」。
John Greene

回答:


148

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

target_include_directories(t x/y)ターゲットスコープがある-ターゲットx/yのインクルードパスに追加されますt。。

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


35
後者の方が一般的に好ましいと思います(cmake 3を使用している限り)。これは、パッティングの追加の利点があるx/y使用するすべての依存ターゲットのパスが含ま中をt自分の中でtarget_link_librariesコマンドを。もちろん前者のための場所がありますが、私は後者が一般的にはより良いと思います。
Phil

2
最初の回答では、後include_directoriesに追加されるターゲットとサブディレクトリのみが影響を受けると述べていました。私は答えを編集しています:ドキュメントには、現在のCMakeListsのすべてのターゲットが影響を受けることが明記されています。ドキュメントには言及されていませんが、影響を受けた後のサブディレクトリのみが影響を受けます(元の回答で正しく述べられていたとおり)
tamas.kenez

@Phil target_include_directoriesはCMake 2.8.11(2013年5月)で導入されました
tamas.kenez

@ tamas.kenezこれを私の注意を喚起してくれてありがとう、修正済み。それが「これから」のことだと確信しました。
Angewは2015

40

何の横にAngewの答えは正しく、間に別の非常に重要な違いを言うinclude_directoriestarget_include_directories一緒に使用する場合、つまりPUBLICまたはINTERFACE後者の移入、INTERFACE_INCLUDE_DIRECTORIESターゲットのプロパティを。このプロパティは、別のターゲットtarget_link_librariesが元のターゲットへのリンクに使用する場合に役立ちます。リンクターゲットには、それらのインクルードディレクトリが自動的に追加されるためです。例を見る

この重要な機能はドキュメントではかなりよく隠されています:target_include_directoriesはpopulatingについて言及してINTERFACE_INCLUDE_DIRECTORIESおり、そのドキュメントには次のように書かれています:

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


PUBLIC物件等のわかりやすい解説は初めてです!ありがとう:D
RL-S

2

@Angewが言ったように、非常に違いは次のとおりです。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.