キーワードの意味は何ですかPUBLIC
、PRIVATE
とINTERFACE
CMakeの者に関連するにはtarget_include_directories
?
回答:
これらのキーワードは、ターゲットに渡すインクルードディレクトリのリストがいつ必要になるかを示すために使用されます。いつまでに、それらのインクルードディレクトリが必要かどうかを意味します。
CMakeのターゲットをコンパイルした場合、それはターゲットを使用しINCLUDE_DIRECTORIES
、COMPILE_DEFINITIONS
し、COMPILE_OPTIONS
プロパティ。でPRIVATE
キーワードを使用する場合は、target_include_directories()
CMakeにそれらのターゲットプロパティを設定するように指示します。
CMakeは、ターゲットAと別のターゲットBの間の依存関係を検出すると(target_link_libraries(A B)
コマンドを使用する場合など)、B
使用要件をA
ターゲットに推移的に伝播します。これらのターゲット使用要件 は、依存するすべてのターゲットがB
満たさなければならないインクルードディレクトリ、コンパイル定義などです。これらは、INTERFACE_*
上記のプロパティのバージョン(などINTERFACE_INCLUDE_DIRECTORIES
)によって指定されINTERFACE
、target_*()
コマンドを呼び出すときにキーワードを使用して入力されます。
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のドキュメントには、このビルド仕様と使用要件のプロパティの詳細が記載されています。
INTERFACE
。target_include_directories(libname INTERFACE include PRIVATE include/libname)
。つまり、ライブラリ内にファイルを直接含めることができますが、ライブラリのユーザーとしてlibname/
最初に挿入する必要があります。
target_include_directories()
実行可能ファイルで使用されるヘッダーファイルが見つかるインクルードディレクトリを設定する必要がある場合は、実行可能ターゲットを呼び出すことができます(たとえば、main()
関数内の引数を解析するために使用する場合は、Boost :: Program_options )。 。PRIVATE
これらのファイルは実行可能ファイル自体をコンパイルするために必要なので、この場合はおそらくキーワードを使用します。ためのいくつかの使用がある場合、私は知らないINTERFACE
か、PUBLIC
実行にかかわらず、。
次の引数のスコープを指定するには、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
私自身の言葉でドキュメントを言い換えるには: