1. ホーム
  2. cmake

[解決済み] CMake target_include_directories スコープの意味

2022-07-07 09:56:57

質問

というキーワードは何を意味するのでしょうか? 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) コマンドを使用した場合など)、CMake はターゲット A とターゲット B の間の依存関係を過渡的に伝播し B 使用条件 A ターゲットに追加します。それらの ターゲットの使用条件 に依存するターゲットが必要とするインクルードディレクトリやコンパイル定義などです。 B に依存するターゲットが満たさなければならないものです。これらは INTERFACE_* バージョンのプロパティで指定されます (例えば INTERFACE_INCLUDE_DIRECTORIES のような)、そして、入力されるのは INTERFACE を呼び出す際に target_*() コマンドを呼び出すときに使用します。

PUBLIC というキーワードは、おおよそ PRIVATE + INTERFACE .

したがって、ライブラリを作成するとします A を作成し、Boostヘッダを使用するとします。あなたはそうするでしょう。

  • target_include_directories(A PRIVATE ${Boost_INCLUDE_DIRS}) もし、ソースファイル内でこれらの Boost ヘッダのみを使用するのであれば ( .cpp ) やプライベートヘッダーファイル ( .h ).
  • target_include_directories(A INTERFACE ${Boost_INCLUDE_DIRS}) もし、ソースファイルの中で Boost ヘッダを使用しないのであれば (つまり、コンパイル時に A ). これについては、実際には実例が思いつきません。
  • target_include_directories(A PUBLIC ${Boost_INCLUDE_DIRS}) の一部に BOTH で含まれているパブリックヘッダーファイルで、 これらの Boost ヘッダーを使用した場合。 A のソースファイルに両方含まれ、また他のクライアントにも含まれるかもしれません。 A ライブラリの他のクライアントにも含まれるかもしれません。

CMake 3.0 のドキュメントに詳細があります。 ビルド仕様と使用要件 プロパティがあります。