CMaketarget_include_directoriesスコープの意味


回答:


125

これらのキーワードは、ターゲットに渡すインクルードディレクトリのリストがいつ必要になるかを示すために使用されます。いつまで、それらのインクルードディレクトリが必要かどうかを意味します。

  • そのターゲット自体をコンパイルします。
  • そのターゲットに依存する他のターゲットをコンパイルするため(パブリックヘッダーの使用など)。
  • 上記の両方の状況で。

CMakeのターゲットをコンパイルした場合、それはターゲットを使用しINCLUDE_DIRECTORIESCOMPILE_DEFINITIONSし、COMPILE_OPTIONSプロパティ。でPRIVATEキーワードを使用する場合は、target_include_directories()CMakeにそれらのターゲットプロパティを設定するように指示します。

CMakeは、ターゲットAと別のターゲットBの間の依存関係を検出すると(target_link_libraries(A B)コマンドを使用する場合など)、B 使用要件Aターゲットに推移的に伝播します。これらのターゲット使用要件 は、依存するすべてのターゲットがB満たさなければならないインクルードディレクトリ、コンパイル定義などです。これらは、INTERFACE_*上記のプロパティのバージョン(などINTERFACE_INCLUDE_DIRECTORIES)によって指定されINTERFACEtarget_*()コマンドを呼び出すときにキーワードを使用して入力されます。

PUBLICキーワードは大体意味しますPRIVATE + INTERFACE

したがって、AいくつかのBoostヘッダーを使用するライブラリを作成しているとします。あなたはするでしょう:

  • target_include_directories(A PRIVATE ${Boost_INCLUDE_DIRS})ソースファイル(.cpp)またはプライベートヘッダーファイル(.h)内でこれらのBoostヘッダーのみを使用する場合。
  • target_include_directories(A INTERFACE ${Boost_INCLUDE_DIRS})ソースファイル内でこれらのBoostヘッダーを使用しない場合(したがって、コンパイルする必要はありませんA)。私は実際にこれの実際の例を考えることはできません。
  • target_include_directories(A PUBLIC ${Boost_INCLUDE_DIRS})パブリックヘッダーファイルでこれらのBoostヘッダーを使用する場合、これらは両方Aのソースファイルに含まれ、Aライブラリの他のクライアントにも含まれる可能性があります。

CMake 3.0のドキュメントには、このビルド仕様と使用要件のプロパティの詳細が記載されています。


18
の実際の例に関してINTERFACEtarget_include_directories(libname INTERFACE include PRIVATE include/libname)。つまり、ライブラリ内にファイルを直接含めることができますが、ライブラリのユーザーとしてlibname/最初に挿入する必要があります。
kaareZ 2017

2
この答えは、ライブラリを作成する上で私には理にかなっています。しかし、実行可能ファイルであるターゲットに対してtarget_include_directoriesを呼び出すのはどうですか?
ノーマンペレット

1
@NormanPellet:target_include_directories()実行可能ファイルで使用されるヘッダーファイルが見つかるインクルードディレクトリを設定する必要がある場合は、実行可能ターゲットを呼び出すことができます(たとえば、main()関数内の引数を解析するために使用する場合は、Boost :: Program_options )。 。PRIVATEこれらのファイルは実行可能ファイル自体をコンパイルするために必要なので、この場合はおそらくキーワードを使用します。ためのいくつかの使用がある場合、私は知らないINTERFACEか、PUBLIC実行にかかわらず、。
TManhente

13

次の引数のスコープを指定するには、INTERFACE、PUBLIC、およびPRIVATEキーワードが必要です。PRIVATEアイテムとPUBLICアイテムは、<target>のINCLUDE_DIRECTORIESプロパティに入力されます。PUBLICおよびINTERFACEアイテムは、<target>のINTERFACE_INCLUDE_DIRECTORIESプロパティに入力されます。次の引数は、インクルードディレクトリを指定します。

ドキュメントから:http//www.cmake.org/cmake/help/v3.0/command/target_include_directories.html

私自身の言葉でドキュメントを言い換えるには:

  • ターゲットのインクルードディレクトリのリストにディレクトリを追加したい
  • PRIVATEを使用すると、ディレクトリがターゲットのインクルードディレクトリに追加されます
  • INTERFACEを使用すると、ターゲットは変更されませんが、INTERFACE_INCLUDE_DIRECTORIESはディレクトリによって拡張されます。変数は、ライブラリのパブリックインクルードディレクトリのリストです。
  • PUBLICを使用すると、PRIVATEとINTERFACEの両方のアクションが実行されます。

5
私はCMAKEのドキュメントを調べましたが、それでも実際に何を意味し、どのようなコンテキストで(ファイルを作成するか、どのようにコンパイルするか)わかりませんでしたか?
シリッシュ2014年

@Sirish:ドキュメントを言い換えようとしましたが、お役に立てば幸いです。
usr1234567 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.